本題來自leetcode。樹節點的定義如下:
/**
* definition for a binary tree node.
* public class treenode
* }*/
首先我們得知道,前序:左根右,後序:左右根
後序的最後乙個是根節點
思考過程:
後序:首先我們選出最後乙個,也就是根節點
中序:根據後序選到的根節點,分出左右子樹序列
後序:在後序中分別找到包含根據中序分出的序列,在後序中找到最後乙個,也就是左右子樹的根節點
中序:根據上次的在後序找到的左右根節點,再次分離左右子樹序列
不斷如此迴圈,直到序列的每個數都遍歷完
在這,發現有遞迴的結構,我們用遞迴實現,資料結構使用題目提供的。
首先,我們發現,每次後序的最後乙個是根節點,我們使用3個引數來提供左右子樹序列的長度(instart:中序序列開始下標,inend:中序序列的結尾下標,postend:後序序列的結尾下標),index是在中序序列中根節點的位置,遞迴結束的條件為序列長度為0(instart>inend)
在這關於左子樹的後序序列結尾下標的計算公式為:postend=postend-(inend-index)-1,理解起來就是:左子樹序列=後序序列長度-中序序列的根右的長度,沒錯是減去根和右子樹的長度,然後不斷遞迴。整個過程就是不斷分離出左右子樹序列,找出根節點,在分離左右子樹序列,找出根節點,而每次傳進引數:後序的最後乙個,左/右子樹的開始,結束下標
class
solution
public treenode helper
(int
inorder,
int[
] postorder,
int postend,
int instart,
int inend)
int croot=postorder[postend]
;//獲得根節點
treenode node=
newtreenode
(croot)
;int index=0;
//獲得根節點在中序中的位置
for(
int i=
0;i<=inend;i++)}
node.left =
helper
(inorder,postorder,postend-
(inend-index)-1
,instart,index-1)
; node.right =
helper
(inorder,postorder,postend-
1,index+
1,inend)
;return node;
}}
從中序與後序遍歷序列構造二叉樹
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 返回如下的二叉樹 3 9 20 15 7因為後序遍歷的順序是 左,右,根 最後乙個節點總是根節點,而中序遍...
從中序與後序遍歷序列構造二叉樹
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 返回如下的二叉樹 3 9 20 15 7 definition for a binary tree nod...
從中序與後序遍歷序列構造二叉樹
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 返回如下的二叉樹 3 9 20 15 7 definition for a binary tree nod...