题目描述
重建二叉树。
要求: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路
本题中,我们需要先搞清楚两个概念,前序遍历与中序遍历。
前序遍历:先访问根节点,然后前序遍历其左子树,再前序遍历其右子树。(跟左右)
中序遍历:中序遍历根节点的左子树,再遍历根节点,后再遍历根节点的右子树。(左跟右)
从上面的概念我们或许有了些思路,首先前序遍历是先访问根节点的,我们知道二叉树的根节点后,再去中序遍历中找到根节点的位置,依据中序遍历原则,显而易见,中序遍历中,根节点的左半部分就是左子树,右半部分就是右子树。那下面呢?同理将前序遍历中第二个节点找到其在中序遍历中的位置,又可以将其分为左右子树结构,这种思想就是递归。
(ps.中序遍历与前序或者后序,分别结合都可以重建二叉树结构,后序与中序的思想与本题思想一致!)
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
class TreeNode{ //定义二叉树的节点
TreeNode father;
int val;
TreeNode left;
TreeNode right;
TreeNode(TreeNode left,TreeNode right){
this.left=left;
this.right=right;
}
TreeNode(int val){
this.val=val;
}
TreeNode(){}
}
public class reConstructTree {
//根据前序与中序遍历还原二叉树结构
public TreeNode reConstruct(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=reConstruct(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
root.right=reConstruct(pre,startPre+i-startIn+1,endPre,in,i+1,endIn);
break;
}
}
return root;
}
public static void main(String[] args) {
int[] pre={1,2,4,7,3,5,6,8};
int[] in={4,7,2,1,5,3,8,6};
reConstructTree test=new reConstructTree();
TreeNode node = test.reConstruct(pre,0,pre.length-1,in,0,in.length-1);
System.out.println(node.right.val);
}
}
总结
本题来源于面试经典教材《剑指offer》中 归属于二叉树类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
最后,感谢Jerry算法!