1. 程式人生 > >二叉樹的先序遍歷(非遞迴演算法)

二叉樹的先序遍歷(非遞迴演算法)

思路一:主要思想就是先將根結點壓入棧,然後根結點出棧並訪問根結點,而後依次將根結點的右孩子、左孩子入棧,直到棧為空為止。

void PreOrder2(BTree T)
{
	if(!T)
		return;
	LinkStack s;
	InitStack(&s);
	Push(&s,T);
	for(;;)
	{
		BTree ptr = NULL;
		ptr = Top(s);
		cout<<"Node : "<<ptr->data<<endl;
		Pop(&s,&ptr);
		if(ptr->rChild)
			Push(&s,ptr->rChild);
		if(ptr->lChild)
			Push(&s,ptr->lChild);
		if(Isempty(s))
			break;

	}
	Destroy(&s);
}
思路二:訪問結點,結點壓棧,訪問左結點,左子樹訪問結束回退到父結點,訪問右子樹。結點出棧表示該結點的左子樹已訪問完。

程式碼:

void PreOrder3(BTree T)
{
	LinkStack s;
	InitStack(&s);
	while(T || !(Isempty(s)))
	{
		if (T)
		{
			cout<<"Node : "<<T->data<<endl;
			Push(&s,T);
			T = T->lChild;
		}
		else
		{
			Pop(&s,&T);
			T = T->rChild;
		}
	}
	Destroy(&s);
}