剑指offer JZ7 重建二叉树

描述:

        给定节点数为 n 的二叉树的前序遍历中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

思路:

        这道题考察的是二叉树根据先序、中序来重建二叉树的知识,这是数据结构二叉树部分的基础考点,清楚这个推导过程是先决条件。

1.递归(思想明确,代码简单)

        想要重建一棵二叉树,得知道这棵树的先序和中序遍历序列,或者是中序和后序遍历序列,这是数据结构的基础知识。得知先序和中序,推导原二叉树,具体解题分为下面几步:

①先序遍历序列第一个节点一定为根节点;

②在中序遍历序列中找到这个根节点的位置;

③这个节点把中序序列分成了左右两部分,对应二叉树的左右子树,把这个子数组用java的库函数建立对应的子树;

④直到子树的序列长度为0,递归结束

代码实现:

public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {

        //1.递归
        if (preOrder.length == 0 || vinOrder.length == 0) return null;
        //构建根节点,先序遍历的第一个节点就是根节点
        TreeNode root = new TreeNode(preOrder[0]);
        for (int i=0;i < vinOrder.length;++i){
            //在中序遍历里面找到先序的第一个元素
            if (preOrder[0] == vinOrder[i]){
                //构建左子树
                root.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder,1,i+1),Arrays.copyOfRange(vinOrder,0,i));
                //构建右子树
                root.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder,i+1,preOrder.length),Arrays.copyOfRange(vinOrder,i+1,vinOrder.length));
                break;
            }
        }
        return root;
}

猜你喜欢

转载自blog.csdn.net/main_double/article/details/142533483