1. 程式人生 > >資料結構篇:二叉樹(三:根據中序和後序遍歷結果推算出完整二叉樹)

資料結構篇:二叉樹(三:根據中序和後序遍歷結果推算出完整二叉樹)

我們先理解一下前中後序遍歷,這是基礎。

//前序遍歷
void Tree::PreOrderTraverse(BiTree *T) {
	if(!T) {
		return ;
	} else {
		cout<<T->data<<" ";
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}

//中序遍歷
void Tree::InOrderTraverse(BiTree *T) {
	if(!T) {
		return ;
	} else {
		InOrderTraverse(T->lchild);
		cout<<T->data<<" ";
		InOrderTraverse(T->rchild);
	}
}

//後序遍歷
void Tree::LastOrderTraverse(BiTree *T) {
	if(!T) {
		return ;
	} else {
		LastOrderTraverse(T->lchild);
		LastOrderTraverse(T->rchild);
		cout<<T->data<<" ";
	}
}

 

我們理解到以下幾點:

  • 前序遍歷是從一個根節點左子樹開始遍歷,同時輸出,當左子樹為空,就遍歷右子樹,右子樹不為空就輸出
  • 中序遍歷是從一個根節點左子樹開始遍歷,直到它的左子樹為空,就輸出,然後輸出此根節點,然後遍歷右子樹,同理輸出
  • 後序遍歷也是從一個根節點左子樹開始遍歷,直到它的左右子樹都為空,就輸出,然後遍歷右子樹,同理輸出,最後輸出根節點

比如這個二叉樹

我的分析方法是按照後序遍歷的結果進行分塊推算

舉個例子

二叉樹的中序遍歷CBEFDGAJILKHNOMP

後序遍歷CFEGDBJLKIONPMHA

請推算出整個二叉樹

1.先看後序遍歷結果,A是最後一位,所以A就是頂點,然後A前一位是H,所以H為A的右子樹頂點,

2.又由中序遍歷結果,以A為分界點,將樹分為兩部分。

又由後序遍歷結果,知B為A的左子樹頂點

所以目前為止我們的二叉樹為

3.從左子樹開始分析

由中序遍歷結果知,C為B的左子樹頂點。D為B的右子樹頂點

繼續同理分析,G為D的右子樹頂點,而對於EF,中序遍歷順序為EF,後序遍歷為FE,只有一種情況,E為F的雙親結點

且F為E的右子樹頂點,因為如果F為E的左子樹頂點,那麼中序遍歷的結果就是FE,而不是EF。至此,左子樹推算完畢。

4.然後是A的右子樹

由中序遍歷分析得,JILK為H的左子樹部分,NOMP為H的右子樹部分

先分析JILK,I為H的左子樹頂點,M為H的右子樹頂點

由中序遍歷知I的左子樹為J,右子樹為LK,並且對於LK,K為I的右子樹頂點,L為K的左子樹頂點,因為如果L為K的右子樹頂點,中序遍歷結果將是KL

 

再分析NOMP

由中序遍歷,P為M的右子樹頂點,NO為M的左子樹部分,且中序遍歷結果為NO,後序遍歷結果為ON,所以N為M的左子樹頂點,O為N的右子樹頂點,所以有

 

至此二叉樹已經完整的推算出來了。

可能看起來很複雜,但是大家在掌握後序遍歷,中序遍歷的基礎上進行理解分析得話,還是比較容易掌握的。多多練習就好。