二叉树

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

中等#105Java时间 O(n)空间 O(n)

题目要做什么

由不含重复值的前序和中序遍历构造二叉树。两数组必须描述同一棵树。输出为层序数组。

题目示例输入preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
题目示例输出[3,9,20,null,null,15,7]

01 为什么这样做

前序的下一项就是当前根。在中序中定位根,左右区间分别对应左右子树。前序游标按根、左、右消耗,每个节点只创建一次。

始终成立的条件

build(left,right) 构建该中序闭区间,cursor 指向尚未使用的前序根。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    private int cursor;3    private final Map<Integer, Integer> index = new HashMap<>();4    public TreeNode buildTree(int[] preorder, int[] inorder) {5        cursor = 0;6        index.clear();7        for (int i = 0; i < inorder.length; i++) index.put(inorder[i], i);8        return build(preorder, 0, inorder.length - 1);9    }10    private TreeNode build(int[] preorder, int left, int right) {11        if (left > right) return null;12        int value = preorder[cursor++];13        TreeNode root = new TreeNode(value);14        int mid = index.get(value);15        root.left = build(preorder, left, mid - 1);16        root.right = build(preorder, mid + 1, right);17        return root;18    }19}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索