分別根據前中序遍歷和後中序遍歷來推二叉樹的結構

2021-08-21 03:31:27 字數 1912 閱讀 7825

分別根據前中序遍歷和後中序遍歷來推二叉樹的結構

1、理論分析:

資料結構

的基礎知識中重要的一點就是能否根據兩種不同遍歷序列的組合(有三種:先序+中序,先序+後序,中序+後序),唯一的確定一棵二叉樹。然後就是根據二叉樹的不同遍歷序列(先序、中序、後序),重構二叉樹。顯然,這三種組合並不是都能唯一確定二叉樹的,其中先序+後序就不能唯一確定一棵二叉樹。這裡我就不證明了。舉個反例:

反例:任何結點只有左子樹的二叉樹和任何結點只有右子樹的二叉樹,其前序序列相同,後序序列相同,但卻是兩棵不同的二叉樹。

2、構造思路:

(1)根據先序遍歷序列和中序遍歷序列構建二叉樹:

先序:abcdefg

中序:cbedfag

step1、先序遍歷的第乙個結點總是根結點。如上圖中的二叉樹,根結點為a,也是先序遍歷的第乙個值。先序遍歷時父親結點總是在孩子結點之前遍歷。

step2、可以觀察到在中序遍歷中,a是第5個值(從0開始算起)。由於中序遍歷順序為:左子樹,根結點,右子樹。所以a左邊的 這四個結點屬於左子樹,而根結點a右邊的屬於右子樹。

step3、可以從上面的結論很輕鬆的得到遞迴式。在構建了根結點a後,我們可以根據中序遍歷 和分別構建它的左子樹和右子樹。我們同時需要相應的先序遍歷結果用於發現規律。我們可以由先序遍歷知道左右子樹的先序遍歷分別是和。左右子樹也分別為二叉樹,由此可以遞迴來解決問題。

補充進我之前寫的二叉樹類中(class bintree)

int creat_vlr_lvr(t vlr,t lvr,int len)

//vlr:根左右---------------前序遍歷	//lvr:左根右---------------中序遍歷	int creat_vlr_lvr(bintreenode*&p,t *vlrh,t *vlrt,t *lvrh,t *lvrt)//			if(*valuepre == '\0'&&*valuein == '\0')				while((*valuein) != '\0'&& (*valuein) != *valuepre)			++valuein;		int leftlen = valuein - lvrh;		t *leftvlr = vlrh + leftlen;		if(leftlen > 0)				if(leftlen < vlrt-vlrh)				return ok;	}
(2)根後序遍歷序列和中序遍歷序列構建二叉樹:

後序:cefdbga

中序:cbedfag

step1、後序遍歷的最後乙個結點總是「根結點」。如上圖中的二叉樹,根結點為a,也是後序遍歷的最後乙個值。

step2、在中序遍歷中找到「根節點」,但是這裡要先建立右子樹,因為後序遍歷後面的是右子樹的根節點,(這裡唯一跟前序遍歷不一樣的是後序遍歷是從後往前乙個乙個退的)。從中序遍歷中我們可以看到是a的右子樹,所以先建立。

step3、後序遍歷再往前退,到b,那麼b是a的左子樹......

根據以上的結論,通過遞迴好實現的。

int creat_lrv_lvr(t lrv,t lvr,int len)

//lrv:左右根---------------後序遍歷	//lvr:左根右---------------中序遍歷	int creat_lrv_lvr(bintreenode*&p,t *lrvh,t *lrvt,t *lvrh,t *lvrt)			if(rightlen < lrvt-lrvh)				return ok;	}
分別根據前中序遍歷和後中序遍歷來推二叉樹的結構

根據後序和中序遍歷輸出先序遍歷

本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。輸入格式 第一行給出正整數nn le 30 30 是樹中結點的個數。隨後兩行,每行給出nn個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。輸出格式 在一行中輸出preorder 以...

根據後序和中序遍歷輸出先序遍歷

本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。第一行給出正整數n 30 是樹中結點的個數。隨後兩行,每行給出n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。在一行中輸出preorder 以及該樹的先序遍歷結果。數字間有1個空...

根據後序和中序遍歷輸出先序遍歷

n 是樹中結點的個數。隨後兩行,每行給出 n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。7 2 3 1 5 7 6 4 1 2 3 4 5 6 7preorder 4 1 3 2 6 5 7 思路 一.根據後序遍歷和中序遍歷建樹 1.二叉鍊錶結構的定義 ...