二叉树的前序中序后序按层遍历

#include<iostream>
#include<queue> 
using namespace std;
#include<stdlib.h>

typedef struct BiTNode{
	char data ;
	struct BiTNode *lchild,*rchild; 
}BiTNode,*BiTree;
void Visit(char data){
	cout<<" "<<data ;
}
void PreOrderTraverse(BiTree &T){
	//后序遍历二叉树 
	if(T){
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
		Visit(T->data);
	}
}
void FrontOrderTraverse(BiTree &T){
	//前序后序遍历二叉树 
	if(T){
		Visit(T->data);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
		
	}
}
void MIDOrderTraverse(BiTree &T){
	//中序遍历二叉树 
	if(T){
		PreOrderTraverse(T->lchild);
		Visit(T->data);
		PreOrderTraverse(T->rchild);
		
	}
}
void CreatBiTree(BiTree &T){
	//先序创建二叉树 
	char ch ;
	cin>>ch;
	if(ch=='#') {
		T= NULL;
		cout<<"读了一个#"<<endl; 
	}
	else{
		T = new BiTNode; 
		T->data = ch ;
		cout<<"存入" <<ch<<endl;
		CreatBiTree(T->lchild);
		CreatBiTree(T->rchild);
	} 
}
void destroyBiTree(BiTree &T){
	//销毁一课二叉树 
	if(T){
		cout<<"销毁结点上的元素为:"<<T->data<<endl;
		destroyBiTree(T->lchild);
		destroyBiTree(T->rchild);
		delete T;
		T =  NULL;
	}
}

int leafCountOfBiTree(BiTree &T){ 
	//递归求二叉树的叶子结点个数	
	if(T==NULL)
		return 0;
	if(T->lchild==NULL && T->rchild==NULL)
		return 1;
	return leafCountOfBiTree(T->lchild) + leafCountOfBiTree(T->rchild);
}
void Layer_order(BiTree &T){
	//按层遍历 
	queue<BiTree> q ;//调用stl 
	q.push(T);//先将头结点存入 
	while(!q.empty()){//判空 
		BiTree T2= q.front();//头结点取出 
		q.pop();//头结点退队 
		cout<<" " <<T2->data;//输出 
		if(T2->lchild){
			q.push(T2->lchild);//存入左孩子 
		}
		if(T2->rchild){
			q.push(T2->rchild);//右孩子 
		}
	}
}
//void InOrderTraverse(BiTree T){
//	//栈实现前序遍历 
//	BiTree p ;
//	InitStack(S);
//	Push(S,T)//让根进栈 
//	while(!StackEmpty(S)){//判空 
//		while(GetTop(S,p)&&p) 
//			Push(S,p->lchild)
//		Pop(S,p);
//		if(!StackEmpty(S)){
//			Pop(S,p);//或者当前栈 
//			visit(p->data);//得到当前数据 
//			Push(S,p->rchild);//右儿子进栈 
//		}
//	}
//} 
//void InOrderTraverse(BiTree T){
//	//栈遍历 
//	BiTree p;
//	InitStack(S);
//	p = T;
//	while(p||!StackEmpty(S)){
//		//判断左树是否有左孩子 
//		if(p){
//			Push(S,p);
//			p = p->lchild;
//		}else{
//			Pop(S,p);
//			visit(p->data);
//			p = p->rchild;
//		}
//	}
//}

//void ArrangeTraverse(BiTree T){
//	//
//	BiTree p; 
//	while(front<rear){
//		p = Queue[++front];
//		visit(p->data);
//		if(p->lchild!=NULL{
//			Queue[++rear] = p->lchild;
//		}
//	}
//}
int main(){
	BiTree T ;
	CreatBiTree(T);
	cout<<"开始按层遍历咯!"<<endl;
//	cout<<"后序:"<<endl;
//	PreOrderTraverse(T);
//	cout<<endl<<"前序:";
//	FrontOrderTraverse(T);
//	cout<<endl<<"中序:";
//	MIDOrderTraverse(T); 
//	cout<<endl<<"叶子结点个数为:"<<leafCountOfBiTree(T)<<endl;
	Layer_order(T); 
//	destroyBiTree(T); 
	return 0; 
}























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值