劍指 Offer 07 重建二叉樹

2022-09-20 05:36:08 字數 1489 閱讀 3703

劍指 offer 07. 重建二叉樹

這裡主要是要往分治上想,並且聯絡到中序序列和前序序列的關係。

我們知道中序序列,對於val而言,出現在val左邊的值都在它的左子樹上,出現在右側的值都在它的右子樹上。

那麼我們考慮,遍歷中序序列,將中序序列的值和其出現的索引位置對映,這樣,我們就能比較容易的分割開左子樹和右子樹。

我們獲取到值val在中序序列中的索引idx,假定我們選取的這一段中序序列區間為\([l...r]\),那麼左子樹的長度len為\(idx - l\)。

由於同一顆子樹的前序遍歷長度和中序遍歷長度一定是一樣的,因此我們可以把所求得的長度len運用到前序遍歷的結果中去。

利用以下三個結論:

①.前序遍歷的首元素 為 樹的根節點 node 的值。

②.在中序遍歷中搜尋根節點 node 的索引 ,可將 中序遍歷 劃分為 [ 左子樹 | 根節點 | 右子樹 ] 。

③.根據中序遍歷中的左(右)子樹的節點數量,可將 前序遍歷 劃分為 [ 根節點 | 左子樹 | 右子樹 ] 。

因此**如下所示:

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1, map);

}private treenode build(int preorder, int prestart, int preend, int inorder, int instart, int inend, mapmap)

int rootval = preorder[prestart];

treenode root = new treenode(rootval);

// 獲取root在中序遍歷結果中的位置

int midindex = map.get(rootval);

// 獲取左子樹的長度

int leftlength = midindex - instart;

root.left = build(preorder, prestart + 1, prestart + leftlength, inorder, instart, midindex - 1, map);

root.right = build(preorder, prestart + leftlength + 1, preend, inorder, midindex + 1, inend, map);

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