劍指 Offer 07 重建二叉樹

2021-10-24 00:24:46 字數 1374 閱讀 3117

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

例子:

前序遍歷 preorder =[3

,9,20

,15,7

] 中序遍歷 inorder =[9

,3,15

,20,7

]

輸出:

3

/ \ 9

20/ \

157

首先我們需要了解一下二叉樹的前中後序遍歷的規則

1、前序遍歷:中左右

2、中序遍歷:左中右

3、後序遍歷:左右中

上面的規則很簡單我們只需要根據中的位置判斷就行,左始終是在右的左邊,反正右始終在左的右邊

解法1:遞迴

思路分析:首先我們演算法首先需要判空,同時遞迴也需要首先找到結束遞迴的點,在這個題目中結束的點就是兩個形參為空,根據我們上面了解到的規則,我們可以總結出,前序遍歷的第乙個值就是二叉樹的根結點,後續遍歷的中間節點是數的根節點,所以我門使用前序遍歷的第乙個引數,去和中序遍歷的各個節點對比,找到相同的那個,找到的這個值的左邊是左子樹,右邊的都是又子樹,以此類推我們就可以總結出遞迴規則

let preorder =[3

,9,20

,15,7

];// 前

let inorder =[9

,3,15

,20,7

];// 中

function

treenode

(val)

function

buildtree

(preorder, inorder)

const rootval = preorder[0]

;const node =

newtreenode

(rootval)

;let i =0;

for( i =

0; i < inorder.length; i++)}

// 這裡尋找乙個數在陣列中的位置,方法很多,就不一一枚舉了

node.left =

buildtree

(preorder.

slice(1

, i +1)

, inorder.

slice(0

, i)

) node.right =

buildtree

(preorder.

slice(1

+ i)

, inorder.

slice

(i +1)

)return node

}

劍指offer07 重建二叉樹

這是乙個非常高頻的面試題。題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例子 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 思路 題目給出了前序和中序遍歷,我們可以知道前序的...

劍指 Offer 07 重建二叉樹

難度 中等 題目描述 解題思路 這道題之前做過,但是忘得乾乾淨淨了。現在再做一遍撿一撿,說不定哪次面試就出到了呢 總體思想就是遞迴,用雜湊表來儲存對應的中序遍歷的下標,空間換時間,免得每次都要去遍歷找下標。然後每次遞迴的時候,要給對應的左子樹和右子樹在對應陣列裡的下標,左端點大於右端點的時候返回空。...

劍指 Offer 07 重建二叉樹

首先要懂得前序遍歷和中序遍歷,可以寫出兩個陣列,自己手動來重建一下二叉樹,來看看重建二叉樹是怎麼乙個流程。以圖中給出的二叉樹為例,根據前序遍歷的特點,可知前序遍歷的首尾數字是根節點,比如這個時候根節點數值為3,可以在中序遍歷中第2個位置找到數值3,在3左邊的9為3的左子樹,右邊的15,20,7為右子...