题干
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8
}和中序遍历序列{4,7,2,1,5,3,8,6
},则重建二叉树并返回。
思路
对于这道题目的解决而言,首先我们要明白对于二叉树的前序,中序,后序,层序遍历的各个步骤,这里我贴出别人写的比较详细的步骤
二叉树遍历详解
这个时候我们来了我们的前序和中序,然后先来手工的构建出二叉树。
- 首先构建一个二叉树,首先需要先知道根节点是哪一个,然后才能辨别出左右节点依次来进行分解。
- 前序和中序遍历的来源就知道了对于前序来说其第一个节点必然是根几点,于是对于看到中序来说,就可以发现对于
4,7,2
来说必然是左子树,对于5,3,8,6
来说必然是右子树(因为对于中序来说,根节点前面的是左子树,后面的是右子树呀,先左,后中,再右的来源)。所以2,4,7,
都是左子树的部分。 - 这个时候已经知道了左右以后,先来对左子树进行判断。发现对于前序的下一个节点是
2
当然有可能是根节点的下一个右子树的小根节点,但是我们已经判断出来了,左子树是存在的,所以对于2
来说就是左子树的根节点
(这个根节点是相对于之前的根节点的伪根节点)。 - 于是我们就发现对于之前判断出来的左子树
4,7,2
来说2是其的根节点,但是2的右边没有值,就说明了对于以2
为根节点的子树来说没有左子树。然后剩下的就是节点4,发现节点4的前面是不存在的(先判断根节点由前序,然后由中序判断节点的方位值)。也就是说节点4是没有左子树的,只有一个右子树为7。于是暂时判断出来左子树的全部位置。
6. 在完成了左子树的判断以后,根据相同的思想,看前序判断根节点,看中序判断左右子树,循环往复。就可以构建出
7
代码
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0)
return null;
int temp=pre[0];
if(pre.length==1)
return new TreeNode(temp);
int p=0;
for(int i=0;i<in.length;i++){
if(temp==in[i])
{
p=i;
break;
}
}
TreeNode tree=new TreeNode(temp);
tree.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,p+1),Arrays.copyOfRange(in,0,p));
tree.right=reConstructBinaryTree(Arrays.copyOfRange(pre,p+1,pre.length),Arrays.copyOfRange(in,p+1,in.length));
return tree;
}