题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路解析:
- 前序遍历的序列第一个是根节点,所以从中序遍历中找到这个根节点,中序遍历中根节点的位置可以分离做右子树
- 左子树:i-startIn的距离是左子树的长,前序遍历pre中从startPre-1的位置开始到startPre+(i-startIn)为左子树;In中,startIn到i-1是左子树,
- 右子树:前序遍历pre中,从startPre+(i-startIn)+1,到endPre是右子树;在中序遍历In中,从i+1到endIn是右子树
代码:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root =re(pre,0,pre.length-1,in,0,in.length-1);
return root;
}
public TreeNode re(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(in[i]==pre[startPre]){
root.left=re(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
root.right=re(pre,startPre+i-startIn+1,endPre,in,i+1,endIn);
}
}
return root;
}
}
代码:https://www.jianshu.com/p/07ac60fd2e5c