題目要求:給定一顆二叉樹的中序遍歷的數組inorder[]和后序遍歷的數組postorder[],構造出這顆二叉樹。
我們知道,根據前序+中序 或者 后序+中序都可以構造出一顆二叉樹,而前序+后序則不能構造出一顆二叉樹。
例如,下圖的二叉樹的
前序序列為:1-3-5-6
中序序列為:3-1-6-5
后序序列為:3-6-5-1
一顆二叉樹
那么為什么前序+中序或者后序+中序行,而前序+后序不行呢?
(2)后序+中序的構造過程:
后序序列為:3-6-5-1
中序序列為:3-1-6-5
后序序列是先左,再右,再根的過程。那么前序中的最后一個數1一定為二叉樹的根,根據這個1我們可以去中序序列中找1所在的位置,然后因為中序序列是先左再根再右的過程,那么中序序列的1的左邊部分(3)一定是左子樹的節點,1的右邊部分(6和5)一定是右子樹的節點,根據這個結果,我們再去后序序列中找根的左子樹部分……我們發現這是個遞歸的過程。
第一次遞歸
第三次遞歸
直到當前子樹的根節點沒有左右節點為止,這樣,一顆二叉樹一定可以被構造出來。
根據這個過程,我們得到了這道題目的解題思路。
需要四個輔助的指針,一個postend指向當前先序序列中的開始位置(當前樹的根節點),一個instart指向當前中序序列的開始位置,一個inend指向當前中序序列的結束位置,一個inIndex指向當前中序序列中的根的位置。
代碼如下。
返回結果為