题目:输入某二叉树的前序遍历和中序遍历的结果,假设结果中不包含重复元素,请重建该二叉树。
思路:前序:访问顺序:根-->左子树-->右子树
后序:访问顺序:左子树-->根-->右子树
1.要想重建一个序列的二叉树,就要知道每序列中每一个结点的左子树和右子树。
2.前序序列的第一个结点值就是根结点的值,根据这个根结点的值到遍历中序序列,找到这个结点,则这个结点的左边序列
为根的左子树,右边序列为根的右子树。
代码如下:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { return reConstructBinaryTreeOne(pre,0,pre.length-1,in,0,in.length-1); } private TreeNode reConstructBinaryTreeOne(int [] pre,int startPre,int endPre, int [] in,int startIn,int endIn){ //标明了什么时候跳出递归 if(startPre>endPre||startIn>endIn) return null; //将当前输入的前序序列的第一个结点作为根结点,到输入的中序序列中找它的左子树和右子树
TreeNode root=new TreeNode(pre[startPre]); for(int i=startIn;i<=endIn;i++){ if(pre[startPre]==in[i]) //根结点的左子树
root.left=reConstructBinaryTreeOne(pre,startPre+1,i-startIn+startPre,in,startIn,i-1); //根结点的右子树
root.right=reConstructBinaryTreeOne(pre,i-startIn+startPre+1,endPre,in,i+1,endIn); }} return root; }}