C语言实现二叉树的基本操作

(1)节点的定义

  1. typedef struct BTNode{  
  2.     int data;  
  3.     struct BTNode *lChild;  
  4.     struct BTNode *rChild;  
  5. }BiTNode;  


(2)二叉树的创建
  1. //先序创建二叉树  
  2. int CreateBiTree(BiTNode **T)  
  3. {  
  4.     int ch;  
  5.     scanf("%d",&ch);  
  6.     if (ch == -1)  
  7.     {  
  8.         *T = NULL;  
  9.         return 0;  
  10.     }  
  11.     else  
  12.     {  
  13.         *T = (BiTNode *)malloc(sizeof(BiTNode));  
  14.         if (T == NULL)  
  15.         {  
  16.             printf("failed\n");  
  17.             return 0;  
  18.         }  
  19.         else  
  20.         {  
  21.             (*T)->data = ch;  
  22.             printf("输入%d的左子节点:",ch);  
  23.             CreateBiTree(&((*T)->lChild));  
  24.             printf("输入%d的右子节点:",ch);  
  25.             CreateBiTree((&(*T)->rChild));  
  26.         }  
  27.     }  
  28.   
  29.     return 1;  
  30. }  



(3)先序遍历二叉树
  1. //先序遍历二叉树  
  2. void PreOrderBiTree(BiTNode *T)  
  3. {  
  4.     if (T == NULL)  
  5.     {  
  6.         return;  
  7.     }  
  8.     else  
  9.     {  
  10.         printf("%d ",T->data);  
  11.         PreOrderBiTree(T->lChild);  
  12.         PreOrderBiTree(T->rChild);  
  13.     }  
  14. }  



(4)中序遍历二叉树
  1. //中序遍历二叉树  
  2. void MiddleOrderBiTree(BiTNode *T)  
  3. {  
  4.     if (T == NULL)  
  5.     {  
  6.         return;  
  7.     }  
  8.     else  
  9.     {  
  10.         MiddleOrderBiTree(T->lChild);  
  11.         printf("%d ",T->data);  
  12.         MiddleOrderBiTree(T->rChild);  
  13.     }  
  14. }  



(5)后续遍历二叉树
  1. //后续遍历二叉树  
  2. void PostOrderBiTree(BiTNode *T)  
  3. {  
  4.     if (T == NULL)  
  5.     {  
  6.         return;  
  7.     }  
  8.     else  
  9.     {  
  10.         PostOrderBiTree(T->lChild);  
  11.         PostOrderBiTree(T->rChild);  
  12.         printf("%d ",T->data);  
  13.     }  
  14. }  



(6)二叉树的深度
  1. //二叉树的深度  
  2. int TreeDeep(BiTNode *T)  
  3. {  
  4.     int deep = 0;  
  5.     if (T != NULL)  
  6.     {  
  7.         int leftdeep = TreeDeep(T->lChild);  
  8.         int rightdeep = TreeDeep(T->rChild);  
  9.         deep = leftdeep >= rightdeep?leftdeep+1:rightdeep+1;  
  10.     }  
  11.   
  12.     return deep;  
  13. }  



(7)叶子节点个数
  1. //叶子节点个数  
  2. int LeafCount(BiTNode *T)  
  3. {  
  4.     static int count;  
  5.     if (T != NULL)  
  6.     {  
  7.         if (T->lChild == NULL && T->rChild == NULL)  
  8.         {  
  9.             count++;  
  10.         }  
  11.   
  12.         LeafCount(T->lChild);  
  13.         LeafCount(T->rChild);  
  14.     }  
  15.   
  16.     return count;  
  17. }  



(8)测试函数
  1. //主函数  
  2. int main(int argc,const char *argv[])  
  3. {  
  4.     BiTNode *T;  
  5.     int depth,leafCount = 0;  
  6.     printf("请输入第一个节点的值,-1表示没有叶节点:\n");  
  7.     CreateBiTree(&T);  
  8.   
  9.     printf("先序遍历二叉树:");  
  10.     PreOrderBiTree(T);  
  11.     printf("\n");  
  12.   
  13.     printf("中序遍历二叉树:");  
  14.     MiddleOrderBiTree(T);  
  15.     printf("\n");  
  16.   
  17.     printf("后续遍历二叉树:");  
  18.     PostOrderBiTree(T);  
  19.     printf("\n");  
  20.   
  21.     depth = TreeDeep(T);  
  22.     printf("树的深度为:%d\n",depth);  
  23.       
  24.     leafCount = LeafCount(T);  
  25.     printf("叶子节点个数:%d\n",leafCount);  
  26.   
  27.     return 0;  

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值