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