lc105.java 2.2 KB
Newer Older
L
liu13 已提交
1 2 3 4 5 6 7
package code;
/*
 * 105. Construct Binary Tree from Preorder and Inorder Traversal
 * 题意:根据先序和中序,构造二叉树
 * 难度:Medium
 * 分类:Array, Tree, Depth-first Search
 * 思路:通过递归的方式,找左节点和右节点
L
liu13 已提交
8
 * Tips:思路记一下,自己想不起来。递归的方法,每次把inorder数组分为两半,设置一个pre_index,每次根据pre_index建立节点,向下递归。
L
liu13 已提交
9 10
 */
public class lc105 {
L
liu13 已提交
11
    public static class TreeNode {
L
liu13 已提交
12 13 14 15 16 17
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

L
liu13 已提交
18 19 20 21
    public static void main(String[] args) {
        int[] preorder = {3,9,20,15,7};
        int[] inorder = {9,3,15,20,7};
        buildTree(preorder,inorder);
L
liu13 已提交
22
    }
L
liu13 已提交
23 24 25 26
    public static TreeNode buildTree(int[] preorder, int[] inorder) {
        return recursion(preorder, inorder, 0, 0, inorder.length-1);
    }
    public static TreeNode recursion(int[] preorder, int[] inorder, int pre_index, int start, int end){   //start,end代表在inorder上搜索的范围
L
liu13 已提交
27 28
        if(start>end || start >inorder.length)
            return null;
L
liu13 已提交
29 30 31 32 33
        TreeNode tn = new TreeNode(preorder[pre_index]);
        int in_index = 0;
        for (int i = 0; i <= end; i++) {
            if(preorder[pre_index]==inorder[i])
                in_index = i;
L
liu13 已提交
34
        }
L
liu13 已提交
35 36
        tn.left = recursion(preorder, inorder, pre_index+1, start, in_index-1);
        tn.right = recursion(preorder, inorder, pre_index+in_index-start+1, in_index+1, end);   //注意右孩子节点index参数
L
liu13 已提交
37
        return tn;      //记住函数的返回值的设置,返回Node,递归的构造子树
L
liu13 已提交
38
    }
L
liu13 已提交
39

L
liu13 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52
    public TreeNode buildTree2(int[] preorder, int[] inorder) {
        return helper(preorder, inorder, 0, 0, preorder.length-1);
    }
    public TreeNode helper(int[] preorder, int[] inorder, int cur, int left, int right){
        if(left>right) return null;
        TreeNode tn = new TreeNode(preorder[cur]);
        int i = left;
        for(; i<=right; i++) if(inorder[i]==preorder[cur]) break;
        tn.left = helper(preorder, inorder, cur+1, left, i-1);
        tn.right = helper(preorder, inorder, cur+i-left+1, i+1, right);
        return tn;
    }

L
liu13 已提交
53
}