二叉树的基本操作
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)输出二叉树中从每个叶子结点到根结点的路径
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术