1. 程式人生 > >二叉樹遍歷的非遞迴演算法實現

二叉樹遍歷的非遞迴演算法實現

linux c++ 模板類

討論範圍

本部落格只實現二叉樹非遞迴演算法的遍歷,請自行學習二叉樹和模板類等相關知識。程式碼中附帶大量註釋,所以就不在進行詳細說明。

中序遍歷

template <typename T>void Post<T>::NInOrder11(BTNode<T> *t)
{
	BTNode<T> *buf[MAXSIZE];
	BTNode<T> *p = NULL;
	p = t;
	int top = -1;
	while(top != -1 || p != NULL)//判斷棧是否為空
	{
		while(p != NULL)//判斷左子樹是否為空
		{
			top++;buf[top] = p;//如果不為空,則進棧
			p = p->lchild;
		}
		if(top != -1)//判斷棧中是否有元素
		{
			p = buf[top];top--;//得到沒有左子樹為空的父親節點
			cout<<p->data<<" ";//輸出當前節點
			p = p->rchild;//找當前節點的右子樹,將右子樹賦給p,再對他進行判斷
		}
	}
}

後序遍歷

template <typename T>void Post<T>::NPostOrder11(BTNode<T> *t)
{//{
	BTNode<T> *buf[MAXSIZE];
	BTNode<T>* p = NULL;
	int top = -1;
	p = t;
	//後續遍歷演算法
	bool flag;//設立標誌位,用於判斷左子樹是否為空
	BTNode<T> *q;
	do 
	{
		while(p != NULL)//判斷左子樹是否為空
		{
			top++;buf[top] = p;//將左子樹全部入棧
			p = p->lchild;
		}
		q = NULL;//這個用於判斷右子樹是否為NULL
		flag = true;//設立標誌位,標誌左子樹已經為空
		while(top != -1 && flag == true)//判斷棧是否為空,並且左子樹已經為空
		{
			p = buf[top];//將棧中的元素取出來,賦給p,top--不能寫到這裡
			//因為,如果當前節點的右子樹與上一次退棧的節點相同時
			//我沒才需要進行退棧,

			if(p->rchild == q)//判斷右子樹是否為空
			{
				cout<<p->data<<" ";//列印的是沒有左子樹和右子樹的節點
				top--;
				q = p;//將上一次列印的節點記錄下來
			}else
			{
				p = p->rchild;//將指標下移
				flag = false;//將標誌位設定為false,意思是左子樹不為空
				//並且將迴圈移出,重複do while迴圈,讓他繼續判斷右子樹的左子樹是否為空
			}
		}
	} while (top != -1);//判斷棧是否為空

}

請仔細閱讀,深入理解演算法。對於以後將一些遞迴演算法轉換為非遞迴演算法,在思想上有很大幫助。在轉換上可以使用棧、佇列、陣列等均可。