輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3/ \
9 20
/ \
15 7
限制:0 <= 節點個數 <= 5000
分析:
二叉樹遍歷規律:
前序遍歷:【根節點, 遞迴前序遍歷左子樹,遞迴前序遍歷右子樹】
中序遍歷:【遞迴中序遍歷左子樹,根節點,遞迴中序遍歷右子樹】
發現前序遍歷陣列的第乙個元素是根節點,中序遍歷陣列中以根節點作為樞軸(pivot)把左右子樹分隔開來,這樣可以在中序遍歷的陣列中獲取左子樹和右子樹的長度,再在前序遍歷陣列根據左右子樹各自的長度
遞迴執行第一遍:前序[3,9,20,15,7],中序[9,3,15,20,7],根節點為3,切分得到新的左子樹前序[9]、中序[9],右子樹前序[20,15,7]、中序[15,20,7]
樹:3/ \
... ...
遞迴執行第二遍:前序[9],中序[9],長度只有1,故根節點是9,返回根節點
樹:3/ \
9 ...
遞迴執行第三遍:前序[20,15,7],中序[15,20,7],根節點是20,切分得到新的左子樹前序[15]、中序[15],右子樹前序[7]、中序[7],返回根節點
樹:3/ \
9 20
遞迴執行第四遍:前序[15],中序[15],長度只有1,故根節點是15,返回根節點
樹:3/ \
9 20/15
遞迴執行第五遍:前序[7],中序[7],長度只有1,故根節點是7,返回根節點,結束
樹:3/ \
9 20
/ \
15 7
遞迴解法:
1/**迭代解法:分析://todo2* definition for a binary tree node.
3* function treenode(val) 7*/
8/**9
* @param preorder
10* @param inorder
11* @return
12*/
13var buildtree = function
(preorder, inorder) ;
實現:
var buildtree = function(preorder, inorder)
else
node.right = new
treenode(preorderval);
stack.push(node.right);}}
return
root;
};
劍指offer全套解答 劍指offer 1 5
1.二維陣列中的查詢 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。public class solution int n array 0 length i...
劍指offer全套解答 劍指offer 36 45
36.兩個鍊錶的第乙個公共節點 輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 public class solution return p 37.數字在排序陣列 現的次數 統計乙個數字在公升序陣列 現的次數。publi...
劍指offer全套解答 劍指offer 46 55
46.孩子們的遊戲 圓圈中最後剩下的數 每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出...