首先要懂得前序遍歷和中序遍歷,可以寫出兩個陣列,自己手動來重建一下二叉樹,來看看重建二叉樹是怎麼乙個流程。
以圖中給出的二叉樹為例,
根據前序遍歷的特點,可知前序遍歷的首尾數字是根節點,比如這個時候根節點數值為3,可以在中序遍歷中第2個位置找到數值3,在3左邊的9為3的左子樹,右邊的15,20,7為右子樹。同時可以把前序 陣列劃分為兩個陣列,即左子樹的前序遍歷陣列9,右子樹的前序遍歷陣列20,15,7,採用遞迴的方式進行求解。
我自己的寫法中,是以中序遍歷為依據返回節點的。當中序遍歷陣列的左邊指標超過了右邊指標,則說明越過了葉子節點,應該返回null;當左邊指標與右邊指標重合時,說明找到了當前根節點的左子節點或者右子節點,返回這個節點即可。
我的**:
class solution
return getans(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1, map);
}private treenode getans(int preorder, int prestart, int preend, int inorder, int instart, int inend, mapmap)
}
路飛**:
class solution
treenode recur(int pre_root, int in_left, int in_right)
}
路飛題解:
官方**(我的**格式與官方**類似,只是路飛和官方都是以前序遍歷為依據返回節點的)
class solution
mapindexmap = new hashmap();
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, mapindexmap)
int rootval = preorder[preorderstart];
treenode root = new treenode(rootval);
if (preorderstart == preorderend) else }}
官方題解: 劍指offer07 重建二叉樹
這是乙個非常高頻的面試題。題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例子 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 思路 題目給出了前序和中序遍歷,我們可以知道前序的...
劍指 Offer 07 重建二叉樹
難度 中等 題目描述 解題思路 這道題之前做過,但是忘得乾乾淨淨了。現在再做一遍撿一撿,說不定哪次面試就出到了呢 總體思想就是遞迴,用雜湊表來儲存對應的中序遍歷的下標,空間換時間,免得每次都要去遍歷找下標。然後每次遞迴的時候,要給對應的左子樹和右子樹在對應陣列裡的下標,左端點大於右端點的時候返回空。...
劍指 Offer 07 重建二叉樹
題目 給前序和中序二叉樹序列,建立二叉樹 資料都不重複 主方法宣告 public treenode buildtree int preorder,int inorder 思路 使用遞迴方法build private treenode build int preorder,int preorderst...