1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define NUM 100 //二叉树的最大结点数 6 #define QueueSize 100 //队列初始容量 7 #define TRUE 1 8 #define FALSE 0 9 #define OK 1 10 #define ERROR 0 11 #define OVERFLOW -1 12 13 typedef int Status; //函数结果状态代码 14 typedef char DataType; //二叉树结点元素类型为char类型 15 16 //二叉树的存储结构 17 typedef struct node 18 { 19 DataType data; //结点元素 20 struct node *lchild,*rchild; //左右孩子指针 21 }BinTNode,*BinTree; 22 23 typedef BinTNode* ElemType; 24 25 //循环队列存储结构 26 typedef struct 27 { 28 ElemType *base; 29 int front,rear; 30 }SeQueue; 31 32 Status CreateBiTree(BinTree &bt) 33 {//按照先序遍历次序递归建立二叉树。 34 //输入ABC##DE#G##F### 35 char ch; 36 scanf_s("%c",&ch); 37 if(ch == '#') bt = NULL; 38 else 39 { 40 bt = (BinTNode*)malloc(sizeof(BinTNode)); 41 bt->data = ch; //生成根结点 42 CreateBiTree(bt->lchild); //构造左子树 43 CreateBiTree(bt->rchild); //构造右子树 44 } 45 return OK; 46 } 47 48 Status InorderTraversal(BinTree bt) 49 {//中序遍历二叉树的非递归方法 50 BinTNode *stack[NUM]; //定义栈数组 51 int top = 0; //初始化栈 52 stack[top] = bt; 53 do 54 { 55 while(NULL!=stack[top]) 56 {//扫描根结点及其所有的左结点并入栈 57 top = top + 1; 58 stack[top] = stack[top-1]->lchild; 59 } 60 top = top -1; //退栈 61 if(top>=0) //判断栈是否为空 62 { 63 printf("%3c",stack[top]->data); //访问结点 64 stack[top] = stack[top]->rchild; //扫描右子树 65 } 66 }while(top>=0); 67 return OK; 68 } 69 70 void PreOrderTraversal(BinTree bt) 71 {//先序遍历二叉树 72 if(bt) 73 { 74 printf("%3c",bt->data); 75 PreOrderTraversal(bt->lchild); 76 PreOrderTraversal(bt->rchild); 77 } 78 } 79 80 void InOrderTraversal(BinTree bt) 81 {//中序遍历二叉树 82 if(bt) 83 { 84 InOrderTraversal(bt->lchild); 85 printf("%3c",bt->data); 86 InOrderTraversal(bt->rchild); 87 } 88 } 89 void PostOrder(BinTree bt) 90 {//后序遍历二叉树 91 if(bt) 92 { 93 PostOrder(bt->lchild); 94 PostOrder(bt->rchild); 95 printf("%3c",bt->data); 96 } 97 } 98 99 int Size(BinTree bt) 100 {//统计二叉树中所有结点的个数 101 int num1,num2; 102 if(bt==NULL) 103 return 0; 104 else if(bt->lchild==NULL && bt->rchild==NULL) 105 return 1; 106 else 107 { 108 num1 = Size(bt->lchild); //统计左子树的结点个数 109 num2 = Size(bt->rchild); //统计右子树的结点个数 110 return (num1+num2+1); 111 } 112 } 113 114 int LeafCount(BinTree bt) 115 {//统计二叉树的叶子总数 116 int LeafNum; 117 if(bt==NULL) 118 LeafNum = 0; 119 else if((bt->lchild==NULL) && (bt->rchild==NULL)) 120 LeafNum = 1; 121 else 122 LeafNum = LeafCount(bt->lchild)+LeafCount(bt->rchild); //叶子总数为左右子树叶子之和 123 return LeafNum; 124 } 125 126 int Depth(BinTree bt) 127 {//统计二叉树的深度 128 int hl,hr,max; 129 if(bt!=NULL) 130 { 131 hl = Depth(bt->lchild); //求左子树的深度 132 hr = Depth(bt->rchild); //求右子树的深度 133 max = hl>hr?hl:hr; 134 return (max+1); //返回树的深度 135 } 136 else 137 return 0; 138 } 139 140 void Exchange(BinTree bt) 141 {//交换左右二叉树 142 if(bt == NULL) 143 return; 144 BinTNode *temp; 145 temp = bt->lchild; 146 bt->lchild = bt->rchild; 147 bt->rchild = temp; 148 Exchange(bt->lchild); 149 Exchange(bt->rchild); 150 } 151 152 //构造一个循环队列 153 Status InitQueue(SeQueue &Q) 154 { 155 Q.base = (ElemType*)malloc(QueueSize*sizeof(ElemType)); 156 if(!Q.base) exit(0); 157 Q.front = Q.rear = 0; 158 return OK; 159 } 160 161 //插入新的元素为队尾元素 162 Status EnQueue(SeQueue &Q,ElemType e) 163 {//插入的元素为二叉树结点中的元素 164 if((Q.rear+1)%QueueSize == Q.front) 165 { 166 printf("Queue overflow"); 167 return 0; 168 } 169 Q.base[Q.rear] = e; 170 Q.rear = (Q.rear+1)%QueueSize; 171 return 1; 172 } 173 174 //删除队头元素 175 Status DeleteQ(SeQueue &Q,ElemType &e) 176 { 177 if(Q.front == Q.rear) 178 { 179 printf("Queue empty"); 180 return ERROR; 181 } 182 e = Q.base[Q.front]; 183 Q.front = (Q.front+1)%QueueSize; 184 return OK; 185 } 186 187 //判空循环队列 188 Status IsEmptyQ(SeQueue Q) 189 { 190 if(Q.front == Q.rear) 191 return TRUE; 192 else 193 return FALSE; 194 } 195 196 //层次遍历二叉树 197 void LevelOrderTraversal(BinTree bt) 198 { 199 SeQueue Q; 200 ElemType e; 201 InitQueue(Q); //创建并初始化队列 202 if(bt) EnQueue(Q,bt); 203 while(!IsEmptyQ(Q)) 204 { 205 DeleteQ(Q,e); 206 printf("%3c",e->data); 207 if(e->lchild) EnQueue(Q,e->lchild); 208 if(e->rchild) EnQueue(Q,e->rchild); 209 } 210 } 211 212 void main() 213 { 214 BinTree bt; 215 int xz = 1; 216 int yz,sd; 217 while(xz) 218 { 219 printf("\t*************************************\n"); 220 printf("\t\t二叉树的建立及其基本操作\n"); 221 printf("\t*************************************\n"); 222 printf("\t==============================\n"); 223 printf("\t1,建立二叉树的存储结构\n"); 224 printf("\t2,二叉树的基本操作\n"); 225 printf("\t3,交换二叉树的左右子树\n"); 226 printf("\t4,二叉树的层次遍历\n"); 227 printf("\t0,退出系统\n"); 228 printf("\t==============================\n"); 229 printf("\t请选择:(0~4)\n"); 230 scanf("%d",&xz); 231 getchar(); 232 switch(xz) 233 {//输入:ABC##DE#G##F### 234 case 1: 235 printf("输入二叉树的先序序列结点值:\n"); 236 CreateBiTree(bt); 237 printf("二叉树的链式存储结构建立完成\n"); 238 printf("\n"); 239 break; 240 case 2: 241 printf("该二叉树的先序遍历序列是:"); 242 PreOrderTraversal(bt); //输出ABCDEGF 243 printf("\n"); 244 printf("该二叉树的中序遍历序列是:"); 245 InOrderTraversal(bt); //输出CBEGDFA 246 printf("\n"); 247 printf("该二叉树的后序遍历序列是:"); 248 PostOrder(bt); //输出CGEFDBA 249 printf("\n"); 250 printf("该二叉树的中序遍历序列是(非递归算法):"); 251 InorderTraversal(bt); //输出CBEGDFA 252 printf("\n"); 253 printf("该二叉树的结点个数是:%d\n",Size(bt)); 254 yz = LeafCount(bt); 255 printf("叶子结点个数是:%d",yz); 256 printf("\n"); 257 sd = Depth(bt); 258 printf("该二叉树的深度是:%d\n",sd); 259 printf("\n"); 260 break; 261 case 3: 262 Exchange(bt); 263 printf("该二叉树意已交换左右子树\n"); 264 printf("\n"); 265 printf("交换左右子树后,先序遍历序列是:"); 266 PreOrderTraversal(bt); 267 printf("\n"); 268 printf("交换左右子树后,中序遍历序列是:"); 269 InorderTraversal(bt); 270 printf("\n"); 271 printf("交换左右子树后,后序遍历序列是:"); 272 PostOrder(bt); 273 printf("\n"); 274 break; 275 case 4: 276 printf("该二叉树的层次遍历序列是:"); 277 LevelOrderTraversal(bt); 278 printf("\n"); //输出ABCDEFG 279 case 0: 280 break; 281 default:printf("输入的选项没有对应的操作,请重新选择:\n"); 282 } 283 } 284 }