1. 程式人生 > 實用技巧 >劍指Offer 07.重建二叉樹

劍指Offer 07.重建二叉樹

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

例如,給出

前序遍歷 preorder =[3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:

3
/ \
9 20
/ \
15 7

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length == 0) return null;
        TreeNode res = new
TreeNode(preorder[0]); int idx = -1; for(int i = 0; i < preorder.length; i++){ if(inorder[i] == preorder[0]){ idx = i;break; // 找到前序的根,在中序中的位置,因為通過中序的位置下標,可以得出:根左邊有幾個節點,根的右邊有幾個節點。這是不容易想通的,想通了這一點,就好辦了。
因為可以確定出前序遍歷中,屬於根節點左邊的陣列,同理,右邊也是。同理,中序中,也能切割出兩塊
} } res.left
= this.buildTree(Arrays.copyOfRange(preorder,1,1+idx), Arrays.copyOfRange(inorder,0,idx)); res.right = this.buildTree(Arrays.copyOfRange(preorder,1+idx, preorder.length), Arrays.copyOfRange(inorder,idx+1,inorder.length)); return res; } }