leetcode_105_Construct Binary Tree from Preorder and Inorder Traversal

来源:互联网 发布:淘宝茶叶有多少人竞争 编辑:程序博客网 时间:2024/05/17 01:05

描述:

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

思路:

1.将中序遍历序列和其对应的下标存储到一个map中,方便下面的查找
2.递归选取前序序列的第一个元素作为树的根节点,然后查找根节点在前序序列中位置inorderIndex,inorderIndex-startInorder可以得到左子树的长度
3.根据左子树的长度和startPreOrder可以求出前序序列中左子树的起始位置
4.从上面可以求出左右子树的前序序列和中序序列的起始位置,递归调用建树过程即可。
PS:其实,对于这道题,有更简单的方法,可根据按前序序列元素出现的顺序依次作为树的根节点进行前序建树,这样要简单多了,根本不用分别计算前序和中序序列的左右子树的起始位置,哪天把这种方法的代码给补上。我的方法好繁呐,但是,我感觉更直接,而且,前序中序后序建树均可。得意

代码:

/** * Definition for binary tree * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    int []ArrPreorder;int []ArrInorder;    Map<Integer, Integer>mapInorder=new HashMap<Integer, Integer>();public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length==0||preorder==null)return null;ArrPreorder=preorder;    ArrInorder=inorder;    for(int i=0;i<inorder.length;i++)    mapInorder.put(inorder[i], i);        int start=0, end=preorder.length-1;        TreeNode root =new TreeNode(0);        createTree(root,start,end,start, end);        return root;    }public void createTree(TreeNode root, int start1,int end1,int start2,int end2){int subStart1=start1,subStart2=start2,subEnd1=end1,subEnd2=end2;int target=ArrPreorder[start1];int indexInOrder=mapInorder.get(target);int len=indexInOrder-start2;int indexPreOrder=start1+len;if(start2<=indexInOrder-1){subStart1=start1+1;subEnd1=indexPreOrder;subEnd2=indexInOrder-1;root.left=new TreeNode(0);createTree(root.left,subStart1,start2, subStart2, subEnd2);}root.val=target;if(indexInOrder+1<=end2){subStart1=indexPreOrder+1;subStart2=indexInOrder+1;root.right=new TreeNode(0);createTree(root.right,subStart1,end1, subStart2, end2);}}}

结果:


0 0