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

劍指Offer07.重建二叉樹

題目連結:重建二叉樹
思路:根據前序和中序的排列規律,在中序遍歷時,根節點的左邊是左子樹結點,右邊是右子樹結點,而前序遍歷中首先出現根結點,緊接著根結點的是左子樹結點,然後是右子樹結點。所以,我們只需要確定在前序和中序中根結點的位置,通過根結點可以知道左子樹和右子樹結點的位置,該問題便轉化為根據左右子樹前序和中序遍歷構造樹,這是一個遞迴的過程。
程式碼:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return helper(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1);
    }

    private TreeNode helper(int[] preorder ,int[] inorder, int pstart, int pend, int istart, int iend){
        if(pstart > pend || istart > iend) return null;
        TreeNode root = new TreeNode(preorder[pstart]);
        int tidx = istart;
        while(root.val != inorder[tidx]) tidx++;

        root.left = helper(preorder, inorder, pstart+1, pstart + tidx - istart, istart, tidx-1);
        root.right = helper(preorder, inorder, pstart + tidx - istart + 1, pend, tidx+1, iend);
        return root;
    }
}