5.2.1 Construct Binary Tree from Preorder and Inorder Traversal

来源:互联网 发布:mac下载苹果铃声 编辑:程序博客网 时间:2024/05/29 17:16

原题链接:https://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

这道题看起来不难,但还是没有完整的思路。

我的思路:

设Pre = {1, 2, 4, 5, 3, 7}, In = {4, 2, 5, 1, 3, 7}. 首先我们从pre中知道1是根节点,那么在In里找到1, 则1左边的是它的左子树,右边是它的右子树。然后怎么做?

然后应该递归。(注意递归的思想)。

Time: O(n), Space: O(logn)

以下代码来自:http://blog.csdn.net/muscler/article/details/22907537

/** * Definition for binary tree * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {        public TreeNode buildTree(int[] preorder, int[] inorder) {        if (inorder == null || preorder == null || inorder.length != preorder.length)            return null;        int n = inorder.length;        return buildTree(preorder, inorder, 0, n - 1, 0, n - 1);    }        //dfs (为什么是DFS?) 根据前序遍历和中序遍历生成二叉树    public TreeNode buildTree(int[] preorder, int[] inorder, int s1, int e1, int s2, int e2) {        if (s1 >= inorder.length || s2 >= inorder.length) return null;        //if (s1 == e1) return new TreeNode(preorder[s1]);//不要这两行代码也可以AC        //if (s1 > e1 || s2 > e2) return null;                //前序遍历数组的第一个是根节点        int rootval = preorder[s1];        TreeNode root = new TreeNode(rootval);        int i;                //根据根节点在中序遍历数组里面找到左子树和右子数节点的个数        for (i = s2; i <= e2; i++) {            if(inorder[i] == rootval)                break;        }        int leftlength = i - s2;        int rightlength = e2 - i;                //dfs        root.left = buildTree(preorder, inorder, s1 + 1, s1 + leftlength, s2, i - 1);        root.right = buildTree(preorder, inorder, s1 + leftlength + 1, e1, i + 1, e2);        return root;    }}


0 0
原创粉丝点击