1 #include<stdio.h> 2 #include<malloc.h> 3 #define LEN sizeof(struct ChainTree) 4 struct ChainTree 5 { 6 int num; 7 struct ChainTree *left; 8 struct ChainTree *right; 9 }; 10 /*函数功能:进行查找操作。*/ 11 ChainTree *BinTreeFind(ChainTree *bt,int data)//在二叉树中查找值为data的结点。 12 { 13 ChainTree *p; 14 if(bt==NULL) 15 return NULL; 16 else 17 { 18 if(bt->num==data) 19 return bt; 20 else{ 21 if(p=BinTreeFind(bt->left,data)) 22 return p; 23 else if(p=BinTreeFind(bt->right,data)) 24 return p; 25 else 26 return NULL; 27 } 28 } 29 } 30 /*函数功能:先序遍历。*/ 31 void BinTree_DLR(ChainTree *bt) 32 { 33 if(bt) 34 { 35 printf("%d",bt->num); 36 if(bt->left) 37 { 38 BinTree_DLR(bt->left); 39 } 40 if(bt->right) 41 { 42 BinTree_DLR(bt->right); 43 } 44 } 45 return; 46 } 47 /*函数定义:后序遍历。*/ 48 void BinTree_LRD(ChainTree *bt) 49 { 50 if(bt) 51 { 52 BinTree_LRD(bt->left); 53 BinTree_LRD(bt->right); 54 printf("%d",bt->num); 55 } 56 return; 57 } 58 /*函数功能:中序遍历。*/ 59 void BinTree_LDR(ChainTree *bt) 60 { 61 if(bt) 62 { 63 BinTree_LDR(bt->left); 64 printf("%d",bt->num); 65 BinTree_LDR(bt->right); 66 } 67 return; 68 } 69 /*函数功能初始化一个二叉树,建立根节点。*/ 70 ChainTree *InitRoot() 71 { 72 ChainTree *node; 73 node=(struct ChainTree*)malloc(LEN); 74 printf("请输入根节点的值:"); 75 scanf("%d",&node->num); 76 node->left=NULL; 77 node->right=NULL; 78 return node; 79 } 80 81 /*添加数据到二叉树*/ 82 int BinTreeAddNode(ChainTree *bt,ChainTree *node,int n) 83 { 84 if(bt==NULL) 85 { 86 printf("\n父结点不在,请先设置父结点。"); 87 return 0; 88 } 89 switch(n) 90 { 91 case 1: 92 if(bt->left) 93 { 94 printf("左子树结点不为空。"); 95 return 0; 96 } 97 else 98 bt->left=node; 99 break; 100 case 2: 101 if(bt->right) 102 { 103 printf("右子树结点不为空。"); 104 return 0; 105 } 106 else 107 bt->right=node; 108 break; 109 default: 110 printf("参数错误!\n"); 111 return 0; 112 } 113 return 1; 114 } 115 116 /*函数功能:添加结点到二叉树。*/ 117 void AddNode(ChainTree *bt) 118 { 119 int data; 120 int select; 121 ChainTree *node,*parent; 122 node=(struct ChainTree*)malloc(LEN); 123 printf("\n输入二叉树结点数据"); 124 scanf("%d",&node->num); 125 node->left=NULL; 126 node->right=NULL; 127 printf("\n输入父结点数据:"); 128 scanf("%d",&data); 129 parent=BinTreeFind(bt,data); 130 if(!parent) 131 { 132 printf("\n未找到父结点。"); 133 } 134 printf("\n1.添加到左子树\n2.添加到右子树\n"); 135 do{ 136 scanf("%d",&select); 137 if(select==1||select==2) 138 BinTreeAddNode(parent,node,select); 139 }while(select!=1&&select!=2); 140 } 141 142 /*求二叉树叶子结点个数*/ 143 void CountLeaf(ChainTree *bt,int &count) 144 { 145 if(bt) 146 { 147 if((!bt->left)&&(!bt->right)) 148 count++; 149 CountLeaf(bt->left,count); 150 CountLeaf(bt->right,count); 151 } 152 } 153 154 /*求二叉树深度*/ 155 int BinTreeDepth(ChainTree *bt) 156 { 157 int dep1,dep2; 158 if(bt==NULL) 159 return 0; 160 else 161 { 162 dep1=BinTreeDepth(bt->left); //左子树深度(递归调用) 163 dep2=BinTreeDepth(bt->right); //右子树深度(递归调用) 164 if(dep1>dep2) 165 return dep1+1; 166 else 167 return dep2+1; 168 } 169 } 170 171 int main() 172 { 173 struct ChainTree *p1,*p2,*head,*p3; 174 int select = 1000; 175 int countleaf=0; //该变量计算叶子结点个数 176 while(select!=0){ 177 printf("\n1.设置二叉树根元素\n2.添加二叉树根节点\n3.先序遍历\n4.中序遍历\n5.后序遍历\n6.输出叶子结点个数\n7.求二叉树深度\n0.退出"); 178 scanf("%d",&select); 179 switch(select) 180 { 181 case 1: 182 head=InitRoot(); 183 break; 184 case 2: 185 AddNode(head); 186 break; 187 case 3: 188 BinTree_DLR(head); 189 break; 190 case 4: 191 BinTree_LDR(head); 192 break; 193 case 5: 194 BinTree_LRD(head); 195 break; 196 case 6: 197 countleaf=0; //求二叉树叶子结点数 198 CountLeaf(head,countleaf); 199 printf("\n%d",countleaf); 200 break; 201 case 7: 202 printf("二叉树深度为:%d\n",BinTreeDepth(head)); 203 break; 204 case 0: 205 select = 0; 206 break; 207 } 208 } 209 }
时间: 2024-10-07 20:22:45