非递归实现的前中后序遍历

数据结构定义

typedef struct BTNode{
	int data;
	BTNode * lchild=NULL;
	BTNode * rchild=NULL;
	BTNode(int d):data(d){
	}
}BTNode;

非递归前序

void pre_order_norRecursion(BTNode* p){
	BTNode* S[LEN];	//定义工作栈
	int top=-1;		//栈顶指针
	S[++top] = p;	//根节点入栈
	while(top>=0){
		BTNode* node=S[top--];
		visit(node);
		if(node->rchild)
			S[++top] = node->rchild;
		if(node->lchild)
			S[++top] = node->lchild;
	} 
}

非递归中序

void in_order_norRecursion(BTNode* p){
	BTNode* S[LEN];	//定义工作栈
	int top=-1;		//栈顶指针
//	S[++top] = p;	//不需要根节点入栈 
	while(top>=0 || p){//栈空p空 停止循环 
		while(p){		//移最左下 
			S[++top]=p;
			p=p->lchild;
		} 
		if(top>=0){		//出栈置右 
			p=S[top--];
			visit(p);
			p=p->rchild;
		}
	}
}

口诀:

  • 栈空p空 停止循环
  • 移最左下
  • 出栈置右

非递归后序

void post_order_norRecursion(BTNode* p){
	BTNode* S[LEN];	//定义工作栈
	int top=-1;		//栈顶指针
	BTNode* r=NULL;	//指向最近访问过的节点 
	while(top>=0 || p){//栈空p空 停止循环 
		while(p){	//移最左下 
			S[++top]=p;
			p=p->lchild;
		}
		if(top>=0){		
			p=S[top];	//查看栈顶结点 
			if(p->rchild && p->rchild!=r){	//右存未访 
				p=p->rchild;				//压右入左 
				S[++top]=p;
				p=p->lchild;
			}else{
				p=S[top--];		//否则出栈 
				visit(p);
				r=p;
				p=NULL;
			}
		}
	}
}

口诀:

  • 栈空p空 停止循环
  • 移最左下
  • 右存未访 压右入左
  • 否则出栈

完整代码

#include <bits/stdc++.h> 
#define LEN 100

using namespace std;

typedef struct BTNode{
	int data;
	BTNode * lchild=NULL;
	BTNode * rchild=NULL;
	BTNode(int d):data(d){
	}
}BTNode;

BTNode* create_demo_tree(){
	BTNode* rt=new BTNode(1);
	BTNode* rt_l=rt->lchild=new BTNode(2);
	rt->rchild=new BTNode(4);
	rt_l->lchild=new BTNode(3);
	rt_l->rchild=new BTNode(5);
	return rt;
}

int visit(BTNode* p){
	cout<<p->data<<' ';
}

int in_order(BTNode* p){
	if(p){
		in_order(p->lchild);
		visit(p);
		in_order(p->rchild);
	}
}

void pre_order_norRecursion(BTNode* p){
	BTNode* S[LEN];	//定义工作栈
	int top=-1;		//栈顶指针
	S[++top] = p;	//根节点入栈
	while(top>=0){
		BTNode* node=S[top--];
		visit(node);
		if(node->rchild)
			S[++top] = node->rchild;
		if(node->lchild)
			S[++top] = node->lchild;
	} 
}

void in_order_norRecursion(BTNode* p){
	BTNode* S[LEN];	//定义工作栈
	int top=-1;		//栈顶指针
//	S[++top] = p;	//不需要根节点入栈 
	while(top>=0 || p){//栈空p空 停止循环 
		while(p){		//移最左下 
			S[++top]=p;
			p=p->lchild;
		} 
		if(top>=0){		//出栈置右 
			p=S[top--];
			visit(p);
			p=p->rchild;
		}
	}
}

void post_order_norRecursion(BTNode* p){
	BTNode* S[LEN];	//定义工作栈
	int top=-1;		//栈顶指针
	BTNode* r=NULL;	//指向最近访问过的节点 
	while(top>=0 || p){//栈空p空 停止循环 
		while(p){	//移最左下 
			S[++top]=p;
			p=p->lchild;
		}
		if(top>=0){		
			p=S[top];	//查看栈顶结点 
			if(p->rchild && p->rchild!=r){	//右存未访 
				p=p->rchild;				//压右入左 
				S[++top]=p;
				p=p->lchild;
			}else{
				p=S[top--];		//否则出栈 
				visit(p);
				r=p;
				p=NULL;
			}
		}
	}
}

int main(){
	BTNode* root=create_demo_tree();
//	in_order(root);
//	pre_order_norRecursion(root);
	post_order_norRecursion(root);
	return 0;
}