根據一棵樹的中序遍歷與後序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出
中序遍歷 inorder = [9,3,15,20,7]
後序遍歷 postorder = [9,15,7,20,3]
返回如下的二叉樹:
3
/ \9 20
/ \
15 7
因為後序遍歷的順序是(左,右,根),最後乙個節點總是根節點,而中序遍歷的順序是(左,根,右),我們可以先根據根節點將中序遍歷分為左、右兩棵子樹,再分別遞迴地處理他們。
重點是怎麼正確的把陣列分開。這個看注釋吧~
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
public treenode buildtree
(int inl,
int inr,
int postl,
int postr)}if
(find)
break;}
int pivot = inorder[i]
;// 因為 i是根節點的索引,將 [inl, inr)拆分成 [inl, i)左子樹,[i+1, inr)右子樹
// 因為 j是根節點的索引,所以左右子樹都在根節點的左邊,將 [postl, postr)縮至 [postl, j)
// 注意 j-1的值不一定在拆分的inorder陣列內,畢竟 [inl, i)左子樹,[i+1, inr)右子樹都是 [postl, j)的子集
// 所以有上面的遍歷,從j往前倒序遍歷,第乙個在inorder的陣列內的一定是根節點
treenode root =
newtreenode
(pivot)
; root.left =
buildtree
(inl, i, postl, j)
; root.right =
buildtree
(i +
1, inr, postl, j)
;return root;
}}
從中序與後序遍歷序列構造二叉樹
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 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...
從中序與後序遍歷序列構造二叉樹 二叉樹
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 得到結果 3,9,20,null,null,15,7 二叉樹的後序遍歷最後乙個元素是二叉樹的的根節點,然後...