二叉树的基本操作

1.二叉树的建立

2.二叉树的前序遍历的递归形式

3.二叉树的前序遍历的非递归形式

4.二叉树的中序遍历的递归形式

5.二叉树的中序遍历的非递归形式

6.二叉树的后序遍历的递归形式

7.二叉树的后序遍历的非递归形式

8.二叉树的深度

#include<iostream>
#include<string>
#include<stack>
#include<queue>

using namespace std;

const int MAXSIZE=100;

typedef struct BiTNode  /* 结点结构 */
{
   char data;		/* 结点数据 */
   BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;

/* 构造空二叉树T */
void InitBiTree(BiTree *T){ 
	*T=NULL;
}

/* #表示空树,构造二叉链表表示二叉树T。 */
void CreateBiTree(BiTree *T)
{ 
    	char ch; 
		cin>>ch;
		if(ch=='#') 
			*T=NULL;
		else
		{
			*T=(BiTree)new(BiTNode);
			if(!*T)
				return;
			(*T)->data=ch; /* 生成根结点 */
			CreateBiTree(&(*T)->lchild); /* 构造左子树 */
			CreateBiTree(&(*T)->rchild); /* 构造右子树 */
		}	
 }



/* 前序递归遍历*/
void PreOrderTraverse(BiTree T)
{ 
	if(T==NULL)
		return;
	cout<<(T->data)<<" ";/* 显示结点数据,可以更改为其它对结点操作 */
	PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
	PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}
/*非递归前序遍历*/ 
void PreOrderTraverse2(BiTree T){
	stack<BiTree> s;
	BiTree p;//p是遍历指针
	p=T;
	//栈不空或者p不空的时候循环 
	while(p||!s.empty()){
		if(p!=NULL){
			//存入栈 
			s.push(p);
			//访问根结点 
			cout<<(p->data)<<" ";
			//遍历左子树
			p=p->lchild; 
		}
		else{
			//退栈
			p=s.top();
			s.pop(); 
			p=p->rchild;
		}
	} 
}

/* 中序递归遍历T */
void InOrderTraverse(BiTree T)
{ 
	if(T==NULL)
		return;
	InOrderTraverse(T->lchild); /* 再中序遍历左子树 */
	cout<<(T->data)<<" ";/* 显示结点数据,可以更改为其它对结点操作 */
	InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}

/*非递归实现中序遍历*/
 void InOrderTraverse2(BiTree T){
	stack<BiTree> s;
	BiTree p;//p是遍历指针
	p=T;
	//栈不空或者p不空的时候循环 
	while(p||!s.empty()){
		if(p!=NULL){
			//存入栈 
			s.push(p);
			//遍历左子树
			p=p->lchild; 
		}
		else{
			p=s.top();
			//访问左结点 
			cout<<(p->data)<<" ";
			//退栈
			s.pop(); 
			//访问右子树 
			p=p->rchild;
		}
	}	
}


/*后序递归遍历 */
void PostOrderTraverse(BiTree T)
{ 
	if(T==NULL)
		return;
	PostOrderTraverse(T->lchild); /* 再后序遍历左子树 */
	PostOrderTraverse(T->rchild); /* 最后序遍历右子树 */
	cout<<(T->data)<<" ";/* 显示结点数据,可以更改为其它对结点操作 */
}

/*后序遍历(非递归)  */
typedef struct BiTNodePost{  
    BiTree biTree;  
    char tag;  
}BiTNodePost,*BiTreePost;  

void PostOrderTraverse2(BiTree T){
	stack<BiTreePost> s;
	BiTree p;
	BiTreePost BT;
	p=T;
	//栈不空或者p不空时循环
	while(p != NULL || !s.empty()){
		//遍历左子树
		while(p){
			BT=(BiTreePost)new(BiTNodePost);
			BT->biTree=p;
			//访问过左子树 
			BT->tag='L';
			s.push(BT); 
			p=p->lchild;
		} 
		//左右子树访问完毕访问根节点
		while(!s.empty() && (s.top())->tag == 'R'){
			BT = s.top();
			//退栈
			s.pop();
			BT->biTree;
		    cout<<(BT->biTree->data)<<" ";
		}
		//遍历右子树
		if(!s.empty()){
			BT = s.top();
			//访问过右子树
			BT->tag = 'R';
			p = BT->biTree;
			p = p->rchild;
		}
	}
} 

void LevelTraverse(BiTree T){
	BiTree p;
	p=T;
	queue<BiTree> q;
	//根结点入队 
	q.push(p);
	//队列不空循环 
	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);
		}
	}
}

/*求二叉树的深度*/
int DepthTree(BiTree T){
	int left=1,right=1;
	if(T==NULL)
		return 0;
	left+=DepthTree(T->lchild);
	right+=DepthTree(T->rchild);
	return left>right?left:right;
} 

/* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */
void DestroyBiTree(BiTree *T)
{ 
	if(*T) 
	{
		if((*T)->lchild) /* 有左孩子 */
			DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */
		if((*T)->rchild) /* 有右孩子 */
			DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */
		delete(*T); /* 释放根结点 */
		*T=NULL; /* 空指针赋0 */
	}
}


int main(){
	BiTree T;
	InitBiTree(&T);
	CreateBiTree(&T);
	cout<<"先序遍历:"<<endl; 
	PreOrderTraverse(T);
	cout<<endl;
	cout<<"非递归先序遍历:"<<endl; 
	PreOrderTraverse2(T);
	cout<<endl;
	cout<<"中序遍历:"<<endl; 
	InOrderTraverse(T);
	cout<<endl;
	cout<<"非递归中序遍历:"<<endl; 
	InOrderTraverse2(T);
	cout<<endl;
	cout<<"后序遍历:"<<endl; 
	PostOrderTraverse(T);
	cout<<endl;
	cout<<"非递归后序遍历:"<<endl; 
	PostOrderTraverse2(T);
	cout<<endl;
	cout<<"层次遍历:"<<endl; 
	LevelTraverse(T);
	cout<<endl;
	cout<<"树的深度:"<<DepthTree(T)<<endl;
	return 0;
} 

输入ABDH#K###E##CFI###G#J##

先序遍历ABDHKECFIGJ

中序遍历HKDBEAIFCGJ

后序遍历KHDEBIFJGCA

层次遍历ABCDEFGHIJK

深度5

代码运行结果


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值