劍指 Offer 07 重建二叉樹

2021-10-19 14:13:54 字數 1575 閱讀 1008

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

樣例

前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

返回如下的二叉樹:

限制:

0 <= 節點個數 <= 5000

題解:

前序遍歷的第乙個值為根節點的值,使用這個值將中序遍歷結果分成兩部分

左部分為樹的左子樹中序遍歷結果,右部分為樹的右子樹中序遍歷的結果。然後分別對左右子樹遞迴地求解。

class

solution

// 前序遍歷中的第乙個節點就是根節點

int preorder_root = preorder_left;

// 在中序遍歷中定位根節點

int inorder_root = indexmap.

get(preorder[preorder_root]);

// 先把根節點建立出來

treenode root =

newtreenode

(preorder[preorder_root]);

// 得到左子樹中的節點數目

int size_left_subtree = inorder_root - inorder_left;

// 遞迴地構造左子樹,並連線到根節點

// 先序遍歷中「從 左邊界+1 開始的 size_left_subtree」個元素就對應了中序遍歷中「從 左邊界 開始到 根節點定位-1」的元素

root.left =

mybuildtree

(preorder, inorder, preorder_left +

1, preorder_left + size_left_subtree, inorder_left, inorder_root -1)

;// 遞迴地構造右子樹,並連線到根節點

// 先序遍歷中「從 左邊界+1+左子樹節點數目 開始到 右邊界」的元素就對應了中序遍歷中「從 根節點定位+1 到 右邊界」的元素

root.right =

mybuildtree

(preorder, inorder, preorder_left + size_left_subtree +

1, preorder_right, inorder_root +

1, inorder_right)

;return root;

}public treenode buildtree

(int

preorder,

int[

] inorder)

return

mybuildtree

(preorder, inorder,

0, n -1,

0, n -1);}}

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