⭐欢迎来到剑指offer好题精选专栏,一起学习,一起进步⭐
题目信息:
给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
提示:
1.0 <= pre.length <= 2000
2.vin.length == pre.length
3.-10000 <= pre[i], vin[i] <= 10000
4.pre 和 vin 均无重复元素
5.vin出现的元素均出现在 pre里
6.只需要返回根结点,系统会自动输出整颗树做答案对比
示例1:
输入: [1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值: {1,2,3,4,#,5,6,#,7,#,#,8}
说明: 返回根节点,系统会输出整颗二叉树对比结果
解题思路:
1、首先由前序遍历的根节点找到中序遍历的下标位置,以此分割左树和右树,在递归至只剩一个节点。
2、和方法一类似,也是分割左右树,只不过这次是用数组拷贝的方法解决。
代码如下:
方法1:
class Solution{
public int prindex=0;
public TreeNode buildTreeChild(int []preorder,int []inorder,int inbegin,int inend){
if(inbegin>inend){
return null;
}
TreeNode root=new TreeNode(preorder[prindex]);
int rootIndex=findIndex(inorder, inbegin, inend, preorder[prindex]);
prindex++;
root.left=buildTreeChild(preorder, inorder, inbegin, rootIndex-1);
root.right=buildTreeChild(preorder, inorder, rootIndex+1, inend);
return root;
}
public int findIndex(int []inorder,int inbegin,int inend,int key){
for (int i = inbegin; i <=inend ; i++) {
if(inorder[i]==key){
return i;
}
}
return -1;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder==null || inorder==null){
return null;
}
return buildTreeChild(preorder, inorder, 0, inorder.length-1);
}
}
方法2:
import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
if(pre.length==0){
return null;
}
int rootVal=pre[0];
//找root节点位置
TreeNode root=new TreeNode(rootVal);
int rootIndex=0;
for(int i=0;i<vin.length;i++){
if(rootVal==vin[i]){
rootIndex=i;
break;
}
}
root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(vin,0,rootIndex));
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(vin,rootIndex+1,vin.length));
return root;
}
}