1. 程式人生 > >非遞迴實現二叉樹遍歷(前/中/後序)

非遞迴實現二叉樹遍歷(前/中/後序)

//基本資料結構
template<class T>
struct BinaryTreeNode
{
	T _data;
	BinaryTreeNode<T>* _left;
	BinaryTreeNode<T>* _right;
	BinaryTreeNode(const T& x)
		:_data(x)
		,_left(NULL)
		,_right(NULL)
	{
	}
};
//前序遍歷
void _PrevOrder_NonR(Node* root)
{
	Node* cur=root;
	stack<Node*> s;
	while(!s.empty() || cur)
	{
		while(cur)
		{
			s.push(cur);
			cout<<cur->_data<<" ";
			cur=cur->_left;
		}
		Node* _top=s.top();
		s.pop();
		cur=_top->_right;
	}
}

//中序遍歷
void _InOrder_NonR(Node* root)
{
	Node* cur=root;
	stack<Node*> s;
	while(!s.empty() || cur)
	{
		while(cur)
		{
			s.push(cur);
			cur=cur->_left;
		}
		Node* _top=s.top();
		s.pop();
		cout<<_top->_data<<" ";
		cur=_top->_right;
	}
}

//後序遍歷
void _PostOrder_NonR(Node* root)
{
	Node* cur=root;
	Node* prev=NULL;
	stack<Node*> s;
	while(!s.empty() || cur)
	{
		while(cur)
		{
			s.push(cur);
			cur=cur->_left;
		}
		Node* _top=s.top();
		if(_top->_right == prev || _top->_right == NULL)
		{
			cout<<_top->_data<<" ";
			prev=_top;
			s.pop();
		}
		else
			cur=_top->_right;
	}
}