两种方式遍历二叉树--递归方式和非递归方式

用递归的方法遍历二叉树很简单,但是非递归的遍历二叉树就比较困难了。在非递归方法中,我们需要栈stack的帮助。以下是分别用递归方式和非递归方式写的前、中、后序遍历二叉树的方法,经过验证结果是正确的。

#include <iostream>
#include <stack>
using namespace std;
struct Node 
{
	int num;
	Node* pLeft;
	Node* pRight;
};
void insert(Node* &p,int num)
{
	Node* pTmp=new Node();
	pTmp->num=num;
	pTmp->pLeft=pTmp->pRight=NULL;

	if(p==NULL)
	{
		p=pTmp;
		return;
	}
	if(num<p->num)
		insert(p->pLeft,num);
	else if(num>p->num)
		insert(p->pRight,num);
	else
		return;

}
void PreOrder(Node* p)
{
	if(p==NULL)
		return;
	else
	{
		cout<<p->num<<" ";
		PreOrder(p->pLeft);
		PreOrder(p->pRight);
	}
}
void InOrder(Node* p)
{
	if (p==NULL)
		return;
	else
	{
		InOrder(p->pLeft);
		cout<<p->num<<" ";
		InOrder(p->pRight);
	}
}
void PostOrder(Node* p)
{
	if (p==NULL)
		return;
	else
	{
		PostOrder(p->pLeft);
		PostOrder(p->pRight);
		cout<<p->num<<" ";
	}
}
void PreOrderByLoop(Node* p)
{
	stack<Node*> MyStack;
	if(p==NULL)
		return;
	while(p!=NULL||!MyStack.empty())		//p和栈都为空是结束循环的条件
	{
		while(p!=NULL)
		{
			MyStack.push(p);
			cout<<p->num<<" ";
			p=p->pLeft;
		}
		if(!MyStack.empty())		//从栈中取出一个节点的指针 
		{
			p=MyStack.top();
			MyStack.pop();
			p=p->pRight;			//当前节点的右孩子 当做一个子树的根节点 从新开始循环
		}
	}
	cout<<endl;
}
void InOrderByLoop(Node* p)
{
	stack<Node*> Mystack;
	while(p!=NULL||!Mystack.empty())
	{
		while(p!=NULL)
		{
			Mystack.push(p);
			p=p->pLeft;
		}
		if(!Mystack.empty())
		{
			p=Mystack.top();
			Mystack.pop();
			cout<<p->num<<" ";
			p=p->pRight;
		}
	}
	cout<<endl;
}
void PostOrderByLoop(Node* p)
{
	stack<Node*> Mystack;
	Node* pre=NULL;						//刚刚访问过的节点
	while(p!=NULL||!Mystack.empty())
	{
		while(p!=NULL)
		{
			Mystack.push(p);
			p=p->pLeft;
		}
		p=Mystack.top();
		if(p->pRight==NULL||p->pRight==pre)			//没有右孩子 或者右孩子刚刚遍历过了
		{
			cout<<p->num<<" ";
			Mystack.pop();
			pre=p;
			p=NULL;									//加这一句是为了跳过入栈那部分程序
		}
		else
			p=p->pRight;
	}
	cout<<endl;
}
void main()
{
	Node* p=NULL;
	insert(p,10);
	insert(p,6);
	insert(p,14);
	insert(p,4);
	insert(p,8);
	insert(p,12);
	insert(p,16);
	insert(p,1);
	insert(p,5);
	insert(p,15);
	insert(p,17);
	insert(p,7);
	insert(p,9);

 	cout<<"Preorder:"<<endl;
 	PreOrder(p);
	cout<<endl<<"preorderbyLoop:"<<endl;
	PreOrderByLoop(p);

	cout<<endl<<"Inorder:"<<endl;
	InOrder(p);
	cout<<endl<<"InorderbyLoop:"<<endl;
	InOrderByLoop(p);

	cout<<endl<<"Postorder:"<<endl;
	PostOrder(p);
	cout<<endl<<"PostOrderByLoop:"<<endl;
	PostOrderByLoop(p);
}


原文地址:https://www.cnblogs.com/pangblog/p/3317955.html