题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路

1.使用递归的思想求解。
2.二叉树前序遍历的第一个元素是根。
3.在中序遍历中找到根的位置,根左边的元素就是左子树,根右边的元素就是右子树。
4.递归执行函数,当前序或中序的数组元素个数为0时,结束递归。

Java代码实现

public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        return reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
    }

    private TreeNode reConstructBinaryTree(int [] pre,int preStart,int preEnd,int [] in,int inStart,int inEnd) {
        //递归的结束条件
        if(preStart > preEnd || inStart > inEnd)
            return null;
        int i;
        //寻找根
        for (i = 0; i <= inEnd - inStart + 1 ; i++) {
            if(in[i+inStart] == pre[preStart]){
                break;
            }
        }
        TreeNode root = new TreeNode(pre[preStart]);
        root.left =reConstructBinaryTree(pre,preStart+1,preStart+i,in,inStart,inStart+i-1);
        root.right =reConstructBinaryTree(pre,preStart+i+1,preEnd,in,inStart+i+1,inEnd);
        return root;
    }
}