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

二叉樹的後序遍歷非遞迴演算法

非遞迴思想:

由後序的  左右根 的順序來,不過二叉樹的定義本身就是一個遞迴的思想,只需要在對一個結點訪問之前先將該結點放入到棧中去,並依次將該結點的左孩子也放入到棧中

任意一個結點N,只要他有左孩子,則在N入棧之後,N的左孩子必然也跟著入棧了

每次入棧之後都會判斷迴圈體,這個p是否為空,以及棧是否為空,如果p不為空就會繼續入棧,當p為空棧不為空就開始出棧操作,直到p為空,棧也為空,說明已經遍歷完了
非遞迴程式碼如下:(這個也是非遞迴的一種演算法,還有其他形式)
void PostOrder(BiTree){
	InitStack(S);
	p = T;//用P來指向樹的根結點
	r = NULL;//用一個r結點來標記剛剛被訪問過的結點,在遍歷右子樹時做一個判斷
	while(p||!isEmpty(S){
		if(p){
			push(S,p);//將p結點壓入到棧中
			p = p->lchild;//每次都會先將左孩子給
		}
		else{
			GetTop(S,p);//讀取棧頂元素,用P返回
			if(p->rchild&&p->rchild!=r){
                         //如果有右子樹並且沒有右子樹沒有被訪問過向右走

				p = p->rchild;
				push(S,p);
				p=p->lchild;
			}
			else{
				pop(S,p);//出棧
				visit(p->data);//訪問該結點的資料域
				r = p;
				p = NULL;//用於迴歸根節點
			}
		}
	}
}