105. 从前序与中序遍历序列构造二叉树

深度优先搜索

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {

        return buildSonTree(preorder, 0, preorder.length, inorder, 0, inorder.length);
    }

    /**
     * 左闭右开区间
     * 将前序数组的第一个元素作为根节点,然后找到中序数组中根节点的位置,将其一分为二
     * 然后根据左右子数组的长度,将前序数组也分成相等长度的左右子数组,继续递归分割(因为两个数组长度相等)
     * 定义分割方法,分别传入两个数组,和要分割数组的边界
     */
    public TreeNode buildSonTree(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight){

        /**
         * 如果数组为空,或者只有一个元素,则该节点就是根节点
         */
        if (preRight - preLeft == 0){
            return null;
        }

        if (preRight - preLeft == 1){
            return new TreeNode(preorder[preLeft]);
        }

        /**
         * 否则记录下根节点的位置
         */
        int rootVal = preorder[preLeft];
        TreeNode root = new TreeNode(rootVal);

        int index = 0;

        for (int i = inLeft; i < inRight; i++) {

            if (inorder[i] == rootVal){

                index = i;
                break;
            }
        }

        /**
         * 然后传入新的数组边界,继续分割
         */
        root.left = buildSonTree(preorder, preLeft + 1, preLeft + index - inLeft + 1, inorder, inLeft, index);
        root.right = buildSonTree(preorder, preLeft + index - inLeft + 1, preRight, inorder, index + 1, inRight);

        return root;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

posted @ 2022-02-22 21:14  振袖秋枫问红叶  阅读(39)  评论(0)    收藏  举报