数据结构(C++)——二叉树的基本操作——多种遍历,计算各种节点数,交换子树
一个具有操作菜单的二叉树基本操作。
功能包括:
1.通过先序法创建二叉树;
2.然后实现先序、中序、后序和按层遍历二叉树;
3.实现求二 叉树的总结点数、叶子节点树、单、双分支节点个数;
4.实现求二 叉树的深度;
5.交换二叉树的左右子树等。
-
-
using namespace std;
-
-
-
typedef struct BiTNode
-
{
-
TElemType data;
-
struct BiTNode *lchild,*rchild;
-
} BiTNode,*BiTree;
-
-
BiTree p;//全局变量,用于函数中的操作
-
-
void CreateBiTree(BiTree &T)
-
{
-
//先序遍历的顺序建立二叉树
-
-
char ch;//存入的元素
-
cin>>ch;
-
if(ch=='#') T=NULL;
-
else
-
{
-
T=new BiTNode;
-
T->data=ch;
-
CreateBiTree(T->lchild);
-
CreateBiTree(T->rchild);
-
}
-
}
-
-
void PreOrderTraverse(BiTree T)
-
{
-
//先序遍历二叉树
-
-
if(T)
-
{
-
cout<<T->data<<" ";
-
PreOrderTraverse(T->lchild);
-
PreOrderTraverse(T->rchild);
-
}
-
}
-
-
void InOrderTraverse(BiTree T)
-
{
-
//中序遍历二叉树
-
-
if(T)
-
{
-
InOrderTraverse(T->lchild);
-
cout<<T->data<<" ";
-
InOrderTraverse(T->rchild);
-
}
-
}
-
-
void PostOrderTraverse(BiTree T)
-
{
-
//后序遍历二叉树
-
-
if(T)
-
{
-
PostOrderTraverse(T->lchild);
-
PostOrderTraverse(T->rchild);
-
cout<<T->data<<" ";
-
}
-
}
-
-
void LevelOrderTraverse(BiTree T)
-
{
-
//按层遍历
-
-
queue<BiTree> Q;//按层遍历中使用的队列,需加队列头文件
-
if(T)
-
{
-
Q.push(T);//先将根存入队列
-
-
while(!Q.empty())
-
{
-
p=Q.front();
-
cout<<p->data<<" ";
-
Q.pop();
-
if(p->lchild)
-
Q.push(p->lchild);
-
if(p->rchild)
-
Q.push(p->rchild);
-
}
-
}
-
}
-
-
void ChangeChild(BiTree &T) //交换左右子树
-
{
-
-
if(T->lchild&&T->rchild)
-
{
-
p=T->lchild;
-
T->lchild=T->rchild;
-
T->rchild=p;
-
ChangeChild(T->lchild);
-
ChangeChild(T->rchild);
-
}
-
else if(T->lchild)
-
{
-
T->rchild=T->lchild;
-
T->lchild=NULL;
-
ChangeChild(T->rchild);
-
}
-
else if(T->rchild)
-
{
-
T->lchild=T->rchild;
-
T->rchild=NULL;
-
ChangeChild(T->lchild);
-
}
-
}
-
-
int Depth(BiTree T)
-
{
-
//计算二叉树的深度
-
-
if(!T)
-
return 0;
-
else
-
return max(Depth(T->lchild),Depth(T->rchild)) 1;
-
}
-
-
int NodeCount(BiTree T)
-
{
-
//计算二叉树节点数
-
-
if(!T)
-
return 0;
-
else
-
return NodeCount(T->lchild) NodeCount(T->rchild) 1;
-
}
-
-
int LeafCount(BiTree T)
-
{
-
//计算二叉树叶子节点数
-
-
if(T->lchild&&T->rchild)
-
return LeafCount(T->lchild) LeafCount(T->rchild);
-
else if(T->lchild)
-
{
-
return LeafCount(T->lchild);
-
}
-
else if(T->rchild)
-
{
-
return LeafCount(T->rchild);
-
}
-
else
-
return 1;
-
}
-
-
int SingleCount(BiTree T)
-
{
-
//计算单分支节点个数
-
-
if(T->lchild&&T->rchild)
-
return SingleCount(T->lchild) SingleCount(T->rchild);
-
else if(T->lchild)
-
{
-
return SingleCount(T->lchild) 1;
-
}
-
else if(T->rchild)
-
{
-
return SingleCount(T->rchild) 1;
-
}
-
else
-
return 0;
-
}
-
-
int BothCount(BiTree T)
-
{
-
//计算双分支节点个数
-
-
if(T->lchild&&T->rchild)
-
return BothCount(T->lchild) BothCount(T->rchild) 1;
-
else if(T->lchild)
-
{
-
return BothCount(T->lchild);
-
}
-
else if(T->rchild)
-
{
-
return BothCount(T->rchild);
-
}
-
else
-
return 0;
-
}
-
-
int main()
-
{
-
BiTree T;
-
while(true)
-
{
-
system("cls");
-
cout<<"--二叉树的基本操作--"<<endl;
-
cout<<" 1.先序创建二叉树"<<endl;
-
cout<<" 2.先序遍历二叉树"<<endl;
-
cout<<" 3.中序遍历二叉树"<<endl;
-
cout<<" 4.后序遍历二叉树"<<endl;
-
cout<<" 5.按层遍历二叉树"<<endl;
-
cout<<" 6.二叉树总节点数"<<endl;
-
cout<<" 7.叶子节点数"<<endl;
-
cout<<" 8.单分支节点个数"<<endl;
-
cout<<" 9.双分支节点个数"<<endl;
-
cout<<" a.二叉树深度"<<endl;
-
cout<<" b.交换左右子树"<<endl;
-
cout<<" c.退出"<<endl;
-
cout<<"请输入选择:";
-
char choice;
-
cin>>choice;
-
switch(choice)
-
{
-
case '1':
-
CreateBiTree(T);
-
break;
-
case '2':
-
PreOrderTraverse(T);
-
break;
-
case '3':
-
InOrderTraverse(T);
-
break;
-
case '4':
-
PostOrderTraverse(T);
-
break;
-
case '5':
-
LevelOrderTraverse(T);
-
break;
-
case '6':
-
cout<<NodeCount(T);
-
break;
-
case '7':
-
cout<<LeafCount(T);
-
break;
-
case '8':
-
cout<<SingleCount(T);
-
break;
-
case '9':
-
cout<<BothCount(T);
-
break;
-
case 'a':
-
cout<<Depth(T);
-
break;
-
case 'b':
-
ChangeChild(T);
-
break;
-
case 'c':
-
exit(0);
-
default:
-
cout<<"请输入正确选项!"<<endl;
-
break;
-
}
-
cout<<endl;
-
system("pause");
-
}
-
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggfjkb
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13