剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如

示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

0 <= 节点个数 <= 5000

来源:力扣(LeetCode

知识点:
    前序遍历列表:第一个元素永远是 【根节点 (root)】
    中序遍历列表:根节点 (root)【左边】的所有元素都在根节点的【左分支】,【右边】的所有元素都在根节点的【右分支】
算法思路:
    通过【前序遍历列表】确定【根节点 (root)】
    将【中序遍历列表】的节点分割成【左分支节点】和【右分支节点】
    递归寻找【左分支节点】中的【根节点 (left child)】和 【右分支节点】中的【根节点 (right child)】

leetcode讨论中的思路。感觉很不错,能够理解。

 public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = preorder.length;
        if (n == 0)
            return null;
        int rootVal = preorder[0], rootIndex = 0;
        for (int i = 0; i < n; i++) {
            if (inorder[i] == rootVal) {
                rootIndex = i;
                break;
            }
        }
        TreeNode root = new TreeNode(rootVal);
        root.left = buildTree(Arrays.copyOfRange(preorder, 1, 1 + rootIndex), Arrays.copyOfRange(inorder, 0, rootIndex));
        root.right = buildTree(Arrays.copyOfRange(preorder, 1 + rootIndex, n), Arrays.copyOfRange(inorder, rootIndex + 1, n));

        return root;
    }
/**
 * 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) {
        List preorderlist = new ArrayList<>();
        List inorderlist = new ArrayList<>();
        for (int i = 0 ; i < preorder.length ; i++){
            preorderlist.add(preorder[i]);
            inorderlist.add(inorder[i]);
        }
        return rebuildtree(preorderlist,inorderlist);
    }
    public static TreeNode rebuildtree(List preorderlist , List inorderlist){
        if(inorderlist.size() == 0)
            return null;
        int rootval = preorderlist.remove(0);
        TreeNode root = new TreeNode(rootval);
        int mid = inorderlist.indexOf(rootval);
        root.left = rebuildtree(preorderlist,inorderlist.subList(0,mid));
        root.right = rebuildtree(preorderlist,inorderlist.subList(mid+1,inorderlist.size()));
        return root;
    }
}

你可能感兴趣的:(剑指 Offer 07. 重建二叉树)