时间限制:1秒
空间限制:32768K
热度指数:314202
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
这道题涉及到了树的数据结构,首先构造树需要中序序列+前序或者后序,下面我们先来了解一下给出前序和中序怎么构造树吧
我们先来了解一个序列规律, 前序(根,左,右) , 中序(左跟右) , 后序 (左右跟) 跟在前就是前序,跟在后就是后序,跟在中间就是中序啦♪(^∇^*) 了解了这个之后,我们就开始构建树了,构建步骤如下。
如图所示,我们就可以重构二叉树,根据我们上面的思路就可以写代码啦,这里用的是递归,
/** * 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) { TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);//进行递归 in为中序遍历,pre为前序遍历 return root; } //前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6} private TreeNode reConstructBinaryTree(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=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1); root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn); } return root; } }
其实代码的思路跟纸上做的是一样的。