题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树,假设输入的前序遍历和中序遍历的结果都不含重复的数字。例如:输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}则重建二叉树:其中二叉树的定义如下:
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
思路: 前序遍历的第一个数字总是树的根节点,在中序遍历中,前序遍历第一个值的左边的数字位于根节点的左边,右边的数字位于根节点的右边。以此类推:例如,由前序遍历得出1是根节点,?️中序遍历得出2,4,7在其左边,3,5,6,8在其右边。
奉上代码:
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root = buildTree(pre,in,0,pre.length-1,0,in.length-1);
return root;
}
public static TreeNode buildTree(int[] pre,int[] in,int startPre,int endPre,int startIn,int endIn){
if(startPre>endPre ||startIn>endIn){
return null;
}
TreeNode node = new TreeNode(pre[startPre]);
for(int i=startIn;i<=endIn;i++){
if(in[i]==pre[startPre]){
int length = i-startIn;
node.left =buildTree(pre,in,startPre+1,startPre+length,startIn,i-1);
node.right = buildTree(pre,in,startPre+length+1,endPre,i+1,endIn);
}
}
return node;
}
}