二叉树的基本操作

复制代码
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef struct Bitnode
  4 {
  5     char data;
  6     struct Bitnode *lchild,*rchild;
  7 }Bitnode,*Bitree;
  8 //创建二叉树 
  9 void Createbitree(Bitree &T)
 10 {
 11     char ch;
 12     cin>>ch;
 13     if(ch=='#')
 14     T=NULL;
 15     else
 16     {
 17         T=new Bitnode;
 18         T->data=ch;
 19         Createbitree(T->lchild);
 20         Createbitree(T->rchild);
 21     }
 22 }
 23 //先序遍历 
 24 void Atraverse(Bitree &T)
 25 {
 26     if(T)
 27     {
 28         cout<<T->data;
 29     Atraverse(T->lchild);
 30     Atraverse(T->rchild);
 31     }    
 32  } 
 33  //中序遍历 
 34  void Btraverse(Bitree &T)
 35  {
 36      if(T)
 37      {
 38          Btraverse(T->lchild);
 39      cout<<T->data;
 40      Btraverse(T->rchild); 
 41      }
 42  }
 43  //后序遍历 
 44  void Ctraverse(Bitree &T)
 45  {
 46      if(T)
 47      {
 48              Btraverse(T->lchild);
 49      Btraverse(T->rchild);
 50      cout<<T->data;
 51      }
 52  }
 53  //计算深度 
 54  int Depth(Bitree T)
 55  {
 56      if(T==NULL)
 57      return 0;
 58      int n=Depth(T->lchild);
 59      int m=Depth(T->rchild);
 60      if(m>n)
 61      return (m+1);
 62      else
 63      return (n+1);
 64  }
 65  //计算节点个数 
 66  int Countbitree(Bitree T)
 67  {
 68      if(T==NULL)
 69      return 0;
 70      else
 71      return Countbitree(T->lchild)+Countbitree(T->rchild)+1;
 72  }
 73  //计算叶节点个数 
 74  int Leafbitree(Bitree T)
 75  {
 76      if(T==NULL)
 77      return 0;
 78      if(T->rchild==NULL&&T->lchild==NULL)
 79      return 1;
 80      else
 81      return Leafbitree(T->lchild)+Leafbitree(T->rchild);
 82  }
 83  //计算度为一的节点个数 
 84  int Dubitree(Bitree T)
 85  {
 86      if(T==NULL)
 87      return 0;
 88      else
 89     {
 90       if((T->lchild==NULL&&T->rchild!=NULL)||(T->rchild==NULL&&T->lchild!=NULL))
 91        return 1+Dubitree(T->lchild)+Dubitree(T->rchild);
 92       
 93     } 
 94       return Dubitree(T->lchild)+Dubitree(T->rchild);    
 95  }
 96  //输出二叉树中从每个叶子结点到根结点的路径 
 97  void all(Bitree T,char a[],int len)
 98  {
 99      if(T)
100      {
101          if(T->lchild==NULL&&T->rchild==NULL)
102          {
103          cout<<T->data<<" ";
104          for(int i=len;i>=0;i--)
105          cout<<a[i]<<" ";
106         cout<<endl;
107         }
108         else
109      {
110          a[len++]=T->data;
111          all(T->lchild,a,len);
112          all(T->rchild,a,len);
113      }
114    }
115      
116  }
117  int main()
118  {
119       Bitree T;
120       char ch;
121       cout<<"请选择操作"<<endl; 
122       cout<<"创建二叉树 (0)"<<endl;
123       cout<<"先序遍历(1)"<<endl; 
124       cout<<"中序遍历 (2)"<<endl;
125      cout<<"后序遍历 (3)"<<endl;
126      cout<<"计算二叉树的深度 (4)"<<endl;
127      cout<<"统计结点个数 (5)"<<endl;
128      cout<<"统计叶结点个数 (6)"<<endl;
129      cout<<"统计度为一的结点的个数(7)"<<endl;
130      cout<<"输出二叉树中从每个叶子结点到根结点的路径 (8)"<<endl;
131      cout<<"结束操作(9)"<<endl;
132      cin>>ch;
133      while(ch!='9')
134      {
135          char a[1005];
136          int len=0;
137          switch(ch)
138          {
139              case '0':
140                  cout<<"请输入二叉树(#代表空结点)"<<endl; 
141                  Createbitree(T);
142                  cout<<"创建完成"<<endl;
143                 break;
144             case '1':
145                 cout<<"先序遍历的结果为"<<endl; 
146                 Atraverse(T);
147                 break;
148             case '2':
149                 cout<<"中序遍历的结果为"<<endl; 
150                 Btraverse(T);
151                 break;
152             case '3':
153                 cout<<"后序遍历的结果为"<<endl; 
154                 Ctraverse(T);
155                 break;
156             case '4':
157                 cout<<"二叉树的深度为"<<endl;
158                 cout<<Depth(T)<<endl;
159                 break;
160             case '5':
161                 cout<<"二叉树结点的个数为"<<endl;
162                 cout<<Countbitree(T)<<endl;
163                 break;
164             case '6':
165                 cout<<"二叉树的叶结点个数为"<<endl;
166                 cout<<Leafbitree(T)<<endl;
167                 break;
168             case '7':
169                 cout<<"度为一的节点个数为"<<endl;
170                 cout<<Dubitree(T)<<endl;
171                 break;
172             case '8':
173                 cout<<"二叉树中从每个叶子结点到根结点的路径为"<<endl;
174                 all(T,a,len);
175                 break;
176          }
177          cout<<endl;
178      cout<<"请选择操作"<<endl; 
179       cout<<"创建二叉树 (0)"<<endl;
180       cout<<"先序遍历(1)"<<endl; 
181       cout<<"中序遍历 (2)"<<endl;
182      cout<<"后序遍历 (3)"<<endl;
183      cout<<"计算二叉树的深度 (4)"<<endl;
184      cout<<"统计结点个数 (5)"<<endl;
185      cout<<"统计叶结点个数 (6)"<<endl;
186      cout<<"统计度为一的节点的个数(7)"<<endl;
187      cout<<"输出二叉树中从每个叶子结点到根结点的路径 (8)"<<endl;
188      cout<<"结束操作(9)"<<endl;
189      cin>>ch;
190      }
191      return 0;
192  }
复制代码

(1) 创建二叉树

 

 

 

(2)先序遍历

 

 

 

(3)中序遍历

 

 

 

(4)后序遍历

 

 

 

(5)计算二叉树的深度

 

 

 

(6)统计结点个数

 

 

 

(7)统计叶结点个数

 

 

 

(8)统计度为一的节点的个数

 

 

 

(9)输出二叉树中从每个叶子结点到根结点的路径

 

 

posted @   格蕾  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示