【数据结构】二叉树的定义,递归遍历,非递归遍历,层次遍历,深度等

这篇博客介绍了二叉树的定义,并详细讲解了如何通过递归和非递归方式实现先序、中序、后序遍历,以及层次遍历。此外,还涉及到了二叉树的深度计算、叶子节点计数和打印等功能。通过实例代码展示了这些操作的实现过程。
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值