這是乙個非常高頻的面試題。
題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
例子:前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
思路:題目給出了前序和中序遍歷,我們可以知道前序的遍歷順序為:根節點、左孩子、右孩子;中序:左孩子、根節點、右孩子。可以知道前序遍歷第乙個就是根節點,因此,我們可以在中序遍歷中找出根節點的位置,依據中序遍歷陣列得出:此根節點的左孩子個數,右孩子個數。知道個數之後,根據前序遍歷陣列可以得到左子樹和右子樹的邊界。然後遞迴重複此過程。
使用map用來存放中序遍歷的每個元素和下標位置。中序主要是用來計算左子樹和右子樹的個數,前序依次用來判斷邊界。
截止條件:
1.前序遍歷的下標範圍的開始和結束,如果開始大於結束,則當前二叉樹中沒有結點,返回null;若開始等於結束,二叉樹中恰好只有乙個結點。根據結點值建立該節點作為根節點並返回。
class
solution
//建立乙個map,存入中序遍歷的資訊
mapmap =
newhashmap
();for
(int i=
0;i) treenode root =
buildtree
(preorder,
0,preorder.length-
1,inorder,
0,inorder.length-
1,map)
;return root;
}private treenode buildtree
(int
preorder,
int preorderstart,
int preorderend,
int[
] inorder,
int inorderstart,
int inorderend,map
map)
int rootval = preorder[preorderstart]
; treenode root =
newtreenode
(rootval);if
(preorderstart == preorderend)
//判斷下左右子樹的個數
int rootindex = map.
get(rootval)
;int leftnodes = rootindex - inorderstart;
int rightnodes = inorderend - rootindex;
treenode leftnode =
buildtree
(preorder,preorderstart+
1,preorderstart+leftnodes,inorder,inorderstart,rootindex-
1,map)
; treenode rightnode =
buildtree
(preorder,preorderstart+leftnodes+
1,preorderend,inorder,rootindex+
1,inorderend,map)
; root.left = leftnode;
root.right = rightnode;
return root;
}}
劍指 Offer 07 重建二叉樹
難度 中等 題目描述 解題思路 這道題之前做過,但是忘得乾乾淨淨了。現在再做一遍撿一撿,說不定哪次面試就出到了呢 總體思想就是遞迴,用雜湊表來儲存對應的中序遍歷的下標,空間換時間,免得每次都要去遍歷找下標。然後每次遞迴的時候,要給對應的左子樹和右子樹在對應陣列裡的下標,左端點大於右端點的時候返回空。...
劍指 Offer 07 重建二叉樹
首先要懂得前序遍歷和中序遍歷,可以寫出兩個陣列,自己手動來重建一下二叉樹,來看看重建二叉樹是怎麼乙個流程。以圖中給出的二叉樹為例,根據前序遍歷的特點,可知前序遍歷的首尾數字是根節點,比如這個時候根節點數值為3,可以在中序遍歷中第2個位置找到數值3,在3左邊的9為3的左子樹,右邊的15,20,7為右子...
劍指 Offer 07 重建二叉樹
題目 給前序和中序二叉樹序列,建立二叉樹 資料都不重複 主方法宣告 public treenode buildtree int preorder,int inorder 思路 使用遞迴方法build private treenode build int preorder,int preorderst...