C++实现链式二叉树,操作包括初始化二叉树、前序遍历、中序遍历、后序遍历、层次遍历

C++实现链式二叉树,操作包括初始化二叉树、前序遍历、中序遍历、后序遍历、层次遍历 

[cpp]  view plain copy
  1. // BinaryTree.cpp : 定义控制台应用程序的入口点。  
  2. //C++实现链式二叉树,操作包括初始化二叉树、前序遍历、中序遍历、后序遍历、层次遍历、树的深度  
  3. #include "stdafx.h"  
  4. #include<iostream>  
  5. #include<string>  
  6. using namespace std;  
  7. template<class T>  
  8. struct BiNode  
  9. {  
  10.     T data;  
  11.     struct BiNode<T> *rchild,*lchild;  
  12. };  
  13.   
  14. template<class T>  
  15. class BiTree  
  16. {  
  17. public:  
  18.     BiTree(){  
  19.         cout<<"请输入根节点:"<<endl;  
  20.         Create(root);  
  21.         if (NULL != root)  
  22.         {  
  23.             cout<<"root="<<root->data<<endl;  
  24.         }  
  25.         else  
  26.         {  
  27.             cout << "The BinaryTree is empty." << endl;  
  28.         }  
  29.   
  30.     }  
  31.     ~BiTree(){Release(root);}  
  32.     void PreOrder(){PreOrder(root);}  
  33.     void InOrder(){InOrder(root);}  
  34.     void PostOrder(){PostOrder(root);}  
  35.     void LeverOrder();  
  36.     int Depth(){return Depth(root);}  
  37.   
  38. private:  
  39.     BiNode<T> *root;  
  40.     void Create(BiNode<T>* &bt);  
  41.     void Release(BiNode<T> *bt);  
  42.     void PreOrder(BiNode<T> *bt);  
  43.     void InOrder(BiNode<T> *bt);  
  44.     void PostOrder(BiNode<T> *bt);  
  45.     int Depth(BiNode<T>* bt);  
  46. };  
  47. //前序遍历  
  48. template <class T>  
  49. void BiTree<T>::PreOrder(BiNode<T> *bt)   
  50. {  
  51.     if(bt==NULL)return;  
  52.     else  
  53.     {  
  54.       cout<<bt->data<<"  ";  
  55.       PreOrder(bt->lchild );  
  56.       PreOrder( bt->rchild );  
  57.     }  
  58. }  
  59. //中序遍历  
  60. template <class T>  
  61. void BiTree<T>::InOrder(BiNode<T> *bt)   
  62. {    
  63.     if(bt==NULL)  return ;  
  64.     else   
  65.     {  
  66.         InOrder(bt->lchild );  
  67.         cout<<bt->data<<"  ";  
  68.         InOrder(bt->rchild );  
  69.     }  
  70. }  
  71. //后续遍历  
  72. template <class T>  
  73. void BiTree<T>::PostOrder(BiNode<T> *bt)   
  74. {  
  75.     if(bt==NULL)return ;  
  76.     else  
  77.     {  
  78.         PostOrder(bt->lchild );  
  79.         PostOrder(bt->rchild );  
  80.         cout<<bt->data<<"  ";  
  81.     }  
  82. }  
  83. //层序遍历  
  84. template<class T>  
  85. void BiTree<T>::LeverOrder()  
  86. {  
  87.     int const MaxSize=1000;  
  88.     BiNode<T> *Q[MaxSize];  
  89.     int front, rear;  
  90.     BiNode<T> *p;  
  91.     front=rear=-1;  
  92.     if(root==NULL) return ;  
  93.     Q[++rear]=root;  
  94.     while(front!=rear)  
  95.     {  
  96.        p=Q[++front];  
  97.        cout<<p->data<<"  ";  
  98.        if(p->lchild !=NULL) Q[++rear]=p->lchild ;  
  99.        if(p->rchild !=NULL) Q[++rear]=p->rchild ;  
  100.     }  
  101.   }  
  102. //析构函数  
  103. template <class T>  
  104. void BiTree<T>::Release(BiNode<T> *bt)   
  105. {  
  106.       
  107.     if(bt==NULL)  
  108.     {  
  109.         Release(bt->lchild );  
  110.         Release(bt->rchild );  
  111.         delete bt;  
  112.     }  
  113. }  
  114. //建立二叉树  
  115. template <class T>  
  116. void BiTree<T>::Create(BiNode<T>* &bt)   
  117. {  
  118.     T ch;  
  119.     cin>>ch;  
  120.     if(ch=='#')bt=NULL;  
  121.     else  
  122.     {  
  123.         bt=new BiNode<T>;  
  124.         bt->data =ch;  
  125.         cout<<"调用左孩子"<<endl;  
  126.         Create(bt->lchild );  
  127.         cout<<"调用右孩子"<<endl;  
  128.         Create(bt->rchild );  
  129.     }  
  130. }  
  131.   
  132. //求树的深度  
  133. template <class T>  
  134. int BiTree<T>::Depth(BiNode<T>* bt)  
  135. {  
  136.     if (NULL == bt)  
  137.     {  
  138.         return 0;  
  139.     }  
  140.     int d1 = Depth(bt->lchild);  
  141.     int d2 = Depth(bt->rchild);  
  142.     return (d1 > d2 ? d1 : d2)+ 1;  
  143. }  
  144.   
  145. void main()  
  146. {   
  147.   
  148.     BiTree<char> a;  
  149.     //a.LeverOrder ();  
  150.     a.InOrder();  
  151.   
  152.   
  153.     cout << endl << a.Depth() << endl;  
  154. }  

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值