Leecode劍指 Offer 07 重建二叉樹

2022-07-05 19:30:14 字數 1663 閱讀 5161

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

例如,給出

前序遍歷 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/**

2* 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) ;

迭代解法:分析://todo

實現:

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的那個小朋友要出...