二叉树的遍历

/*
二叉树的遍历(先序中序后序,递归非递归) 
输入示例:124##5##36##7##(高度为3的满二叉树) 
*/
#include <iostream>
#include <cstdlib>
using namespace std;
const int MAXSIZE = 100;
typedef char ElemType;
typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild, *rchild;
}*BiTree;
void CreateTree(BiTree &T){
	//按照先序次序输入二叉树结点,#表示空树
	char c;
	cin >> c;
	if(c=='#')	T = NULL;	//空树 
	else{
		T = (BiTree)malloc(sizeof(BiTNode));
		T->data = c;
		CreateTree(T->lchild);
		CreateTree(T->rchild);
	} 
}

//先序遍历
//思路1:递归
void PreOrder(BiTree T) {
	if(T){
		printf("%c ", T->data);	//访问根结点
		PreOrder(T->lchild);	//递归遍历左子树 
		PreOrder(T->rchild);	//递归遍历右子树 
	}
}

//思路2:非递归
void PreOrder1(BiTree T){
	BiTree p, stack[MAXSIZE];
	int top;
	if(T){
		top = 1;
		stack[top] = T;
		while(top>0){	//栈不空 
			p = stack[top--];		//退栈并访问该结点 
			printf("%c ", p->data);
			if(p->rchild) {
				stack[++top] = p->rchild;	//右孩子进栈 
			}
			if(p->lchild){
				stack[++top] = p->lchild;
			} 
		}
	}
}

//中序遍历
//思路1:递归
void InOrder(BiTree T) {
	if(T){
		InOrder(T->lchild);		//递归遍历左子树 
		printf("%c ", T->data);	//访问根结点 
		InOrder(T->rchild);		//递归遍历右子树 
	}
}

//思路2:非递归
void InOrder1(BiTree T){
	BiTree p, stack[MAXSIZE];
	int top = 0;
	p = T;
	do{
		while(p){	//根结点和每一个左孩子全部入栈 
			stack[++top] = p;
			p = p->lchild;
		}
		if(top>0){	//栈不空 
			p = stack[top--];	//栈顶出栈 
			printf("%c ", p->data);
			p = p->rchild;	//扫描p结点的右结点 
		}
	}while(p || top>0);	//栈不空 或者 p不为空--继续循环 
} 


//后序遍历
//思路1:递归
void PostOrder(BiTree T){
	if(T){
		PostOrder(T->lchild);	//递归遍历左子树 
		PostOrder(T->rchild);	//递归遍历右子树 
		printf("%c ", T->data);	//访问根结点 
	}
}

//思路2:非递归
void PostOrder1(BiTree T){
	BiTree p, stack[MAXSIZE];
	int top = 0;
	int tag[MAXSIZE];	//0表示该结点未被扫描过 
	p = T;
	do{
		while(p){	//找到最左边的结点
			stack[++top] = p;	//结点入栈 
			tag[top] = 0;	//该结点的右结点没有全部扫描过
			p = p->lchild;
		}
		if(top>0){	//栈非空 
			if(tag[top] == 1){	//该结点的右结点全部扫描过
				printf("%c ", stack[top--]->data);	//访问该结点并出栈 
			} 
			else{
				p = stack[top];
				p = p->rchild;	//扫描右结点
				tag[top] = 1;	//该结点已被扫描过
			} 
		}
	}while(top>0 || p);		//栈非空 或者 p结点不为空--继续循环 
}

int main(){
	BiTree t;
	cout << "输入二叉树(先序、空树用#表示):";
	CreateTree(t);
	cout << "先序递归:  ";
	PreOrder(t);
	cout << endl;
	cout << "先序非递归:";
	PreOrder1(t);
	cout << endl;
		
	cout << "中序递归:  ";
	InOrder(t);
	cout << endl;
	cout << "中序非递归:";
	InOrder1(t);
	cout << endl;
	
	cout << "后序递归:  ";
	PostOrder(t);
	cout << endl;
	cout << "后序非递归:";
	PostOrder1(t);
	cout << endl;
}

程序小白,如果程序中有任何的问题,欢迎指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值