题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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) {
return build(0,pre.length - 1,0,in.length - 1,pre,in);
}
public TreeNode build(int s1,int e1,int s2,int e2,int[] str1,int[] str2) {
int c = str1[s1];
TreeNode Root = new TreeNode(c);
int index = 0;
for (int i = s2; i <= e2; i++) {
if (str2[i] == c) {
index = i;
break;
}
}
if (index != s2) {//如果左子树不为空
Root.left = build(s1 + 1, s1 + index - s2, s2, index - 1,str1,str2);
}
if (index != e2) {//如果右子树不为空
Root.right = build(s1 + index - s2 + 1, e1, index + 1, e2,str1,str2);
}
return Root;
}
}