【数据结构】二叉树遍历的非递归算法

在这里插入图片描述
不能放弃,坚持!

#include<iostream>
#include<stack>

using namespace std;
struct BiNode{
	char data;
	BiNode * lchild, * rchild;
};

struct element{
	BiNode * ptr;
	int flag;
};

//前序创建二叉树
void create(BiNode * &bt){
	char ch;
	cin >>ch;
	if(ch == '#') bt = NULL;
	else{
		bt = new BiNode; //bt指向一个新生成的节点
		bt->data = ch;
		create(bt->lchild);
		create(bt->rchild);
	}
}

void PreOrder(BiNode * bt){
	BiNode * p = bt;
	stack<BiNode *>s;
	while(NULL != p || !s.empty()){
		while(NULL != p){
			cout<<p->data<<" ";
			s.push(p);
			p = p->lchild;
		}
		if(!s.empty()){
			p = s.top(); //p指向当前节点的上一个节点
			s.pop();
			p =p->rchild;
		}
	}
}

void InOrder(BiNode * bt){
	BiNode * p = bt;
	stack<BiNode *>s;
	while(NULL != p || !s.empty()){
		while(NULL != p){
			s.push(p);
			p = p->lchild;
		}
		if(!s.empty()){
			p = s.top(); //p指向当前节点的上一个节点
			s.pop(); //访问完左子树,回退到根节点
			cout<<p->data<<" ";
			p =p->rchild;
		}
	}
}

void PostOrder(BiNode * bt){
	BiNode * p = bt;
	stack<element>s;
	element elem;
	while(NULL != p || !s.empty()){ //仅当p为空且栈也为空时退出循环
		
		if(NULL != p){ //第一次入栈,访问左子树
			elem.ptr = p;
			elem.flag = 1;//标记flag为1,表示即将第一次入栈
			s.push(elem);//第一次入栈
			p = p->lchild;//访问左孩子
		}
		
		else{
			elem = s.top();
			s.pop();
			p = elem.ptr; //p指向当前要处理的节点
			if(elem.flag == 1){
				//flag == 1,说明只访问过左子树,还需要继续访问右子树
				elem.flag = 2; //标记flag为2,表示即将第二次入栈
				s.push(elem); //第二次入栈
				p = p->rchild;//访问右孩子
			}else{
				//flag == 2,表示左右子树均访问过了
				cout <<p->data<<" ";
				p = NULL; //访问后,p赋值为空确保下次循环时继续出栈(回退到上一节点)
			}
			
		}
	}
}

int main(){
	BiNode *root;
	create(root);
	PreOrder(root);
	cout<<endl;
	InOrder(root);
	cout<<endl;
	PostOrder(root);
	return 0;
}//AB#D##C##
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值