#include<iostream>
using namespace std;
typedef char Elemtype;
struct BiNode{
Elemtype date;
BiNode *lchild,*rchild;
};
typedef BiNode *Bitree;
//树的初始化
void Inittree(Bitree &bt)
{
bt=NULL;
}
//树的先序创建
void Create(Bitree &bt)
{
//abc##d##ef##g##
Elemtype d;
cin>>d;
if(d=='#') bt=NULL;
else
{
bt=new BiNode;
bt->date=d;
Create(bt->lchild);
Create(bt->rchild);
}
}
//递归
//树的先序遍历
void preOrder(Bitree &bt)
{
if(bt)
{
cout<<bt->date<<" ";
preOrder(bt->lchild);
preOrder(bt->rchild);
}
}
//树的中序遍历
void inOrder(Bitree &bt)
{
if(bt)
{
inOrder(bt->lchild);
cout<<bt->date<<" ";
inOrder(bt->rchild);
}
}
//树的后序遍历
void postOrder(Bitree &bt)
{
if(bt)
{
postOrder(bt->lchild);
postOrder(bt->rchild);
cout<<bt->date<<" ";
}
}
//非递归
//非递归先序遍历
void preIterOrder(Bitree &bt)
{
BiNode* s[100]; //栈s
int top=-1; //空栈
BiNode *p=bt;
while(p||top!=-1)
{
while(p)
{
s[++top]=p; //入栈
cout<<p->date<<" ";
p=p->lchild;
}
p=s[top--]; //出栈
p=p->rchild;
}
}
//非递归中序遍历
void inIterOrder(Bitree &bt)
{
BiNode* s[100]; //栈s
int top=-1; //空栈
BiNode *p=bt;
while(p||top!=-1)
{
while(p)
{
s[++top]=p; //入栈
p=p->lchild;
}
p=s[top--]; //出栈
cout<<p->date<<" ";
p=p->rchild;
}
}
//非递归后序遍历
void postIterOrder(Bitree &bt)
{
BiNode* s[100]; //栈s
int top=-1; //空栈
BiNode *p=bt;
BiNode *q=NULL; //q为当前访问过的节点,初始为空
while(p||top!=-1)
{
while(p)
{
s[++top]=p;
p=p->lchild;
}
p=s[top]; //取栈顶
if(p->rchild==NULL||p->rchild==q)
{//如果p没有右孩子或者右孩子是q
//表明以p为根的右子树已经遍历结束,此时可以访问根结点p了
cout<<p->date<<" ";
q=p; //q指向刚访问过的结点
top--; //出栈
p=NULL;
}
else p=p->rchild;
}
}
//二叉树的按层遍历算法
void levelOrder(Bitree &bt)
{
const int N=100; //队列空间大小
BiNode *q[N];
int front=0,rear=0;
if(bt)
{
q[rear]=bt;//树根入队
rear=(rear+1)%N;
}
BiNode *p;
while(front!=rear)
{
p=q[front];front=(front+1)%N;//出队
cout<<p->date<<" ";
if(p->lchild) q[rear++]=p->lchild;//左孩子入队
if(p->rchild) q[rear++]=p->rchild;//右孩子入队
}
}
//输出带括号的中缀表达式
void inOrder2(Bitree &bt)
{
if(bt)
{
if(bt->lchild&&bt->lchild->lchild&&bt->lchild->rchild) cout<<"("<<" ";
inOrder(bt->lchild);
if(bt->lchild&&bt->lchild->lchild&&bt->lchild->rchild) cout<<")"<<" ";
cout<<bt->date<<" ";
if(bt->rchild&&bt->rchild->lchild&&bt->rchild->rchild) cout<<"("<<" ";
inOrder(bt->rchild);
if(bt->rchild&&bt->rchild->lchild&&bt->rchild->rchild) cout<<")"<<" ";
}
}
//求二叉树的深度
int height(const Bitree &bt)
{
int lh,rh;
if(bt==NULL) return 0;
lh=height(bt->lchild);
rh=height(bt->rchild);
return (lh>=rh?lh:rh)+1;
}
//求二叉树叶子个数
int leafs(const Bitree &bt)
{
if(bt==NULL) return 0;
if(bt->lchild==NULL&&bt->rchild==NULL) return 1;
return leafs(bt->lchild)+leafs(bt->rchild);
}
//打印叶子
void Printleaf(const Bitree &bt)
{
if(bt==NULL) return;
if(bt->lchild==NULL&&bt->rchild==NULL)
cout<<bt->date<<" ";
Printleaf(bt->lchild);
Printleaf(bt->rchild);
}
int main()
{
Bitree bt;
Inittree(bt);
Create(bt);
cout<<"递归先序遍历二叉树:";
preOrder(bt);
cout<<endl;
cout<<"递归中序遍历二叉树:";
inOrder(bt);
cout<<endl;
cout<<"递归后序遍历二叉树:";
postOrder(bt);
cout<<endl;
cout<<"递非归先序遍历二叉树:";
preIterOrder(bt);
cout<<endl;
cout<<"非递归中序遍历二叉树:";
inIterOrder(bt);
cout<<endl;
cout<<"非递归后序遍历二叉树:";
postIterOrder(bt);
cout<<endl;
cout<<"按层遍历二叉树:";
levelOrder(bt);
cout<<endl;
cout<<"输出带括号的中缀表达式:";
inOrder2(bt);
cout<<endl;
cout<<"输出二叉树高度:";
cout<<height(bt);
cout<<endl;
cout<<"输出二叉树叶子个数:";
cout<<leafs(bt);
cout<<endl;
cout<<"输出二叉树的叶子:";
Printleaf(bt);
cout<<endl;
return 0;
}【数据结构】二叉树的定义,递归遍历,非递归遍历,层次遍历,深度等
最新推荐文章于 2022-10-27 20:55:45 发布
这篇博客介绍了二叉树的定义,并详细讲解了如何通过递归和非递归方式实现先序、中序、后序遍历,以及层次遍历。此外,还涉及到了二叉树的深度计算、叶子节点计数和打印等功能。通过实例代码展示了这些操作的实现过程。
1507

被折叠的 条评论
为什么被折叠?



