Construct Binary Tree from Preorder and Inorder Traversal-先序和中序构造树

来源:互联网 发布:综合性数据库 编辑:程序博客网 时间:2024/06/05 04:35
  • 问题描述:Given preorder and inorder traversal of a tree, construct the binary tree.还有个是中序和后序。其实两个题本质是一样的。
  • 问题分析:暂时只想到递归的方法来解题,可是看到耗时似乎蛮高的,不知道还有什么更搞笑的解法。
                  这个思路没什么好讲的,通过先序或者后序找出根节点,然后将中序的序列分开,这样就可以 找出左子树和右子树,然后对左子树和右子树继续用递归即可搞定。代码如下:
  • <span style="font-family:Microsoft YaHei;">/** * Definition for a binary tree node. * 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(preorder == null ||inorder == null || preorder.length == 0 || preorder.length != inorder.length)            return null;        return buildTree(preorder,inorder, 0,preorder.length-1, 0, inorder.length-1);    }    public TreeNode buildTree(int[] preorder, int[] inorder, int i, int j, int k, int l){        if(i == j)            return new TreeNode(preorder[i]);        int index = k;        for(; index <=l && preorder[i] != inorder[index]; index++);        // for(int idx = k+1; idx <= l; idx++)        //     if(preorder[i] == inorder[idx]){        //         index = idx;        //         break;        //     }        TreeNode root = new TreeNode(preorder[i]);        if(index > k)            root.left = buildTree(preorder, inorder, i+1, i + index-k, k, index -1);        if(index < l)            root.right = buildTree(preorder, inorder, i+index-k + 1, j, index +1, l);        return root;    }}</span>
    <span style="font-family:Microsoft YaHei;">/** * Definition for a binary tree node. * 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(preorder == null ||inorder == null || preorder.length == 0 || preorder.length != inorder.length)            return null;        return buildTree(preorder,inorder, 0,preorder.length-1, 0, inorder.length-1);    }    public TreeNode buildTree(int[] preorder, int[] inorder, int i, int j, int k, int l){        if(i == j)            return new TreeNode(preorder[i]);        int index = k;        for(; index <=l && preorder[i] != inorder[index]; index++);        // for(int idx = k+1; idx <= l; idx++)        //     if(preorder[i] == inorder[idx]){        //         index = idx;        //         break;        //     }        TreeNode root = new TreeNode(preorder[i]);        if(index > k)            root.left = buildTree(preorder, inorder, i+1, i + index-k, k, index -1);        if(index < l)            root.right = buildTree(preorder, inorder, i+index-k + 1, j, index +1, l);        return root;    }}</span>


0 0