劍指 Offer 07 重建二叉樹

2021-10-24 17:13:19 字數 2064 閱讀 4593

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

例如,給出

前序遍歷 preorder =[3

,9,20

,15,7

]中序遍歷 inorder =[9

,3,15

,20,7

]

返回如下的二叉樹:

3

/ \ 9

20/ \

157限制:

0<= 節點個數 <=

5000

思路

給了前序和中序遍歷,首先,根一定是前序遍歷的第乙個數,在中序遍歷中通過hashmap找到這個根,中序遍歷中根的左邊為左子樹,根的右邊為右子樹,同時計算兩子樹長度,即可在前序遍歷中確定哪一部分是左子樹,哪一部分是右子樹。

使用遞迴方式解題

第一種:力扣官方解法,太長,盡量別看,明白是那個意思就得了,啥也不是,直接看第二種

public

class

treenode

}public treenode buildtree

(int

preorder,

int[

] inorder)

mapindexmap =

newhashmap

();int length = preorder.length;

for(

int i =

0; i < length; i++

) treenode root =

buildtree

(preorder,

0, length -

1, inorder,

0, length -

1, indexmap)

;return root;

}public treenode buildtree

(int

preorder,

int preorderstart,

int preorderend,

int[

] inorder,

int inorderstart,

int inorderend, map

indexmap)

int rootval = preorder[preorderstart]

; treenode root =

newtreenode

(rootval);if

(preorderstart == preorderend)

else

}

第二種:陣列指標

public treenode buildtree

(int

preorder,

int[

] inorder)

public treenode helper

(int prestart,

int instart,

int inend,

int[

] preorder,

int[

] inorder)

treenode root =

newtreenode

(preorder[prestart]);

int index =0;

for(

int i =

0; i <= inend; i++)}

root.left =

helper

(prestart +

1, instart, index -

1, preorder, inorder)

; root.right =

helper

(prestart + index - instart +

1, index +

1, inend, preorder, inorder)

;return root;

}

劍指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為右子...