二叉树基本操作

时间:2022-01-28 17:31:11
实验目的

1.  熟悉二叉树结点的结构和对二叉树的基本操作。

2.  掌握对二叉树每一种操作的具体实现。

3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。

实验内容

该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。

/* 定义DataType为char类型 */

typedef char DataType;

 

/* 二叉树的结点类型 */

typedef struct BitNode

{DataType data;

     struct BitNode *lchild,*rchild;

}BitNode,*BitTree;

 

/* 初始化二叉树,即把树根指针置空 */

void BinTreeInit(BitTree *BT)

 

/* 按先序次序建立一个二叉树*/

void BinTreeCreat(BitTree *BT)

 

/* 检查二叉树是否为空 */

int BinTreeEmpty(BitTree *BT)

 

/* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */

void BinTraverse(BitTree *BT)

 

/* 求二叉树的深度 */

int BinTreeDepth(BitTree BT)

 

/* 求二叉树中所有结点数 */

int  BinTreeCount(BitTree BT)

 

/* 清除二叉树,使之变为空树 */

void BinTreeClear(BitTree *BT)

 

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <queue>
  4 using namespace std;
  5 
  6 /* 实验内容
  7 该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。
  8 */
  9 
 10 /* 定义DataType为char类型 */
 11 typedef char DataType;
 12  
 13 /* 二叉树的结点类型 */
 14 typedef struct BitNode{
 15     DataType data;
 16     struct BitNode *lchild,*rchild;
 17 }BitNode,*BitTree;
 18  
 19 /* 初始化二叉树,即把树根指针置空 */
 20 void BinTreeInit(BitTree &BT)
 21 {
 22     BT = NULL;
 23 }
 24  
 25 /* 按先序次序建立一个二叉树*/
 26 void BinTreeCreat(BitTree &BT)
 27 {
 28     //printf("请输入该节点的元素值:");
 29     scanf("%c",&BT->data);
 30     while(BT->data==' ' || BT->data=='\n'){
 31         scanf("%c",&BT->data);
 32     }
 33     if(BT->data=='#'){    //输入为'#'说明该节点为空,返回上一步
 34         BT=NULL;
 35         return ;
 36     }
 37     BT->lchild = (BitNode*)malloc(sizeof(BitNode));
 38     BT->rchild = (BitNode*)malloc(sizeof(BitNode));
 39     printf("请输入%c的左节点\n",BT->data);
 40     BinTreeCreat(BT->lchild);
 41     printf("请输入%c的右节点\n",BT->data);
 42     //printf("进入右子树\n");
 43     BinTreeCreat(BT->rchild);
 44 }
 45  
 46 /* 检查二叉树是否为空 */
 47 int BinTreeEmpty(BitTree BT)
 48 {
 49     if(BT==NULL)
 50         return 1;
 51     else 
 52         return 0;
 53 }
 54  
 55 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
 56 void BinTraverse1(BitTree BT)    //按前序遍历
 57 {
 58     if(BT==NULL)    //递归出口
 59         return ;
 60     printf("%c",BT->data);
 61     BinTraverse1(BT->lchild);
 62     BinTraverse1(BT->rchild);
 63 }
 64 
 65 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
 66 void BinTraverse2(BitTree BT)    //按中序遍历
 67 {
 68     if(BT==NULL)    //递归出口
 69         return ;
 70     BinTraverse2(BT->lchild);
 71     printf("%c",BT->data);
 72     BinTraverse2(BT->rchild);
 73 }
 74 
 75 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
 76 void BinTraverse3(BitTree BT)    //按后序遍历
 77 {
 78     if(BT==NULL)    //递归出口
 79         return ;
 80     BinTraverse3(BT->lchild);
 81     BinTraverse3(BT->rchild);
 82     printf("%c",BT->data);
 83 }
 84 
 85 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
 86 void BinTraverse4(BitTree BT)    //按层次遍历
 87 {
 88     queue <BitTree> q;
 89     BitTree cur = BT;
 90     q.push(cur);
 91     while(!q.empty()){    //队列空为止
 92         cur = q.front();
 93         q.pop();
 94         if(cur==NULL)    //遇到空节点退出本次循环
 95             continue;
 96         printf("%c",cur->data);    //输出当前节点元素
 97         q.push(cur->lchild);    //将该节点的两个孩子节点入栈
 98         q.push(cur->rchild);
 99     }
100 }
101  
102 /* 求二叉树的深度 */
103 int BinTreeDepth(BitTree BT)
104 {
105     if(BT==NULL)    //递归出口
106         return 0;
107     //记录左子树深度和右子树深度,返回较大的深度+1
108     int ldp = BinTreeDepth(BT->lchild);
109     int rdp = BinTreeDepth(BT->rchild);
110     return ldp>rdp?ldp+1:rdp+1;
111 }
112  
113 /* 求二叉树中所有结点数 */
114 int  BinTreeCount(BitTree BT)
115 {
116     if(BT==NULL)    //递归出口
117         return 0;
118     //返回左子树节点数和右子树节点数再加上当前节点
119     return BinTreeCount(BT->lchild) + BinTreeCount(BT->rchild) + 1;
120 }
121  
122 /* 清除二叉树,使之变为空树 */
123 void BinTreeClear(BitTree &BT)
124 {
125     if(BT==NULL)    //递归出口
126         return ;
127     //左右子树找到底,然后返回的时候依次销毁空间
128     BinTreeClear(BT->lchild);
129     BinTreeClear(BT->rchild);
130     free(BT);
131     BT=NULL;
132 }
133 
134 int Menu()    //菜单
135 {
136     int n;
137     printf("[1] 按先序次序建立一个二叉树\n");
138     printf("[2] 检查二叉树是否为空\n");
139     printf("[3] 按先序输出二叉树中的所有结点\n");
140     printf("[4] 按中序输出二叉树中的所有结点\n");
141     printf("[5] 按后序输出二叉树中的所有结点\n");
142     printf("[6] 按层次输出二叉树中的所有结点\n");
143     printf("[7] 求二叉树的深度\n");
144     printf("[8] 求二叉树中所有结点数\n"); 
145     printf("[9] 清除二叉树,使之变为空树\n");
146     printf("[0] 退出\n");
147     scanf("%d",&n);
148     return n;
149 }
150 
151 void Reply(BitTree &BT,int n)    //对菜单的响应
152 {
153     switch(n){
154     case 1:    //创建二叉树
155         if(BT!=NULL)
156             printf("已创建二叉树! 请先清除二叉树再创建!\n");
157         else{    //二叉树为空
158             printf("按先序依次增加节点,输入'#'表示空节点!\n\n");
159             BT = (BitNode*)malloc(sizeof(BitNode));    //创建根节点
160             BT->lchild = NULL;
161             BT->rchild = NULL;
162             printf("请输入根节点的元素值:\n");
163             BinTreeCreat(BT);
164             printf("\n二叉树创建成功!\n\n");
165         }
166         break;
167     case 2:    //检查二叉树是否为空
168         if(BinTreeEmpty(BT))
169             printf("二叉树为空!\n\n");
170         else 
171             printf("二叉树不为空!\n\n");
172         break;
173     case 3:    //按前序遍历
174         if(BT==NULL){
175             printf("二叉树为空!无法遍历!\n\n");
176             break;
177         }
178         printf("前序遍历顺序为:\n");
179         BinTraverse1(BT);
180         printf("\n\n");
181         break;
182     case 4:    //按中序遍历
183         if(BT==NULL){
184             printf("二叉树为空!无法遍历!\n\n");
185             break;
186         }
187         printf("中序遍历顺序为:\n");
188         BinTraverse2(BT);
189         printf("\n\n");
190         break;
191     case 5:    //按后序遍历
192         if(BT==NULL){
193             printf("二叉树为空!无法遍历!\n\n");
194             break;
195         }
196         printf("后序遍历顺序为:\n");
197         BinTraverse3(BT);
198         printf("\n\n");
199         break;
200     case 6:    //按层次遍历
201         if(BT==NULL){
202             printf("二叉树为空!无法遍历!\n\n");
203             break;
204         }
205         printf("层次遍历顺序为:\n");
206         BinTraverse4(BT);
207         printf("\n\n");
208         break;
209     case 7:    //求二叉树的深度
210         printf("二叉树的深度为:%d\n\n",BinTreeDepth(BT));
211         break;
212     case 8:    //求二叉树的节点数
213         printf("二叉树的总结点数为:%d\n\n",BinTreeCount(BT));
214         break;
215     case 9:    //清除二叉树
216         if(BT==NULL){
217             printf("二叉树已经为空!无需清空!\n\n");
218             break;
219         }
220         BinTreeClear(BT);
221         printf("清除成功!\n\n");
222         break;
223     default:
224         exit(1);
225     }
226     system("pause");
227     system("cls");
228 }
229 
230 int main()
231 {
232     BitTree BT = NULL;
233     BinTreeInit(BT);    //初始化二叉树
234     while(1){
235         int n = Menu();
236         Reply(BT,n);
237     }
238     return 0;
239 }