题解:
根据先序遍历和中序遍历的特性,在先序遍历的第一个节点是一个树的根,就可以在中序遍历中找到这个根,中序遍历根的左侧就是左子树,右侧则是右子树。
在先序遍历中左子树是最左边的数,右子树是最右边的数,根据在中序遍历中左子树的个数可以发现在先序遍历中左子树的个数,然后将左子树作为一颗树,就重复上面的步骤
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
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};
Solution s = new Solution();
TreeNode t = s.reConstructBinaryTree(pre, in);
s.readTree(t);
}
public TreeNode reConstructBinaryTree(int[] pre,int[] in) {
return constructCore(pre, 0, pre.length, in, 0, in.length);
}
public TreeNode constructCore(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd){
if(preStart >= preEnd || inStart>=inEnd){
return null;
}
TreeNode treeNode = null;
int x = pre[preStart];
for(int i=inStart; i<inEnd; i++){
if(in[i] == x){
treeNode = new TreeNode(x);
treeNode.left = constructCore(pre, preStart+1, i-inStart+preStart+1, in, inStart, i);
treeNode.right = constructCore(pre, i-inStart+preStart+1, preEnd, in, i+1, inEnd);
}
}
return treeNode;
}
public void readTree(TreeNode t){
if(t == null){
return ;
}
System.out.println(t.val);
readTree(t.left);
readTree(t.right);
}
}