数据结构和算法二十
发布日期:2021-05-10 23:52:17 浏览次数:41 分类:精选文章

本文共 2135 字,大约阅读时间需要 7 分钟。

问题一:二叉搜索树的最近公共祖先

方法一:迭代法

  • 循环搜索:从根节点开始,逐层向下移动。
    • 如果当前节点的值小于p和q的值,说明p和q在右子树,移动到右子节点。
    • 如果当前节点的值大于p和q的值,说明p和q在左子树,移动到左子节点。
    • 如果当前节点的值介于p和q之间,则当前节点即为最近公共祖先,停止循环。
  • 返回值:循环结束后返回当前节点。
  • 代码示例

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if (p.val > q.val) {
    TreeNode tmp = p;
    p = q;
    q = tmp;
    }
    while (root != null) {
    if (root.val < p.val) {
    root = root.right;
    } else if (root.val > q.val) {
    root = root.left;
    } else {
    break;
    }
    }
    return root;
    }

    方法二:递归法

  • 递推工作
    • 如果p和q都在当前节点的右子树,递归到右子节点。
    • 如果p和q都在当前节点的左子树,递归到左子节点。
    • 否则,当前节点即为最近公共祖先。
  • 返回值:递归返回当前节点。
  • 代码示例

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if (p.val > q.val) {
    TreeNode tmp = p;
    p = q;
    q = tmp;
    }
    return helper(root, p, q);
    }
    private TreeNode helper(TreeNode root, TreeNode p, TreeNode q) {
    if (root == null) {
    return null;
    }
    if (root.val < p.val) {
    return helper(root.right, p, q);
    } else if (root.val > q.val) {
    return helper(root.left, p, q);
    } else {
    return root;
    }
    }

    问题二:重建二叉树

    方法:分治法

  • 初始化:创建一个哈希表存储中序遍历的元素及其索引。
  • 递归构建
    • 根节点为前序遍历的第一个元素。
    • 根节点在中序遍历中的索引划分左、右子树。
    • 左右子树分别递归构建。
  • 返回值:构建完成的根节点。
  • 代码示例

    public TreeNode buildTree(int[] preorder, int[] inorder) {
    HashMap
    map = new HashMap<>();
    for (int i = 0; i < inorder.length; i++) {
    map.put(inorder[i], i);
    }
    return build(0, 0, inorder.length - 1);
    }
    private TreeNode build(int rootIndex, int left, int right) {
    if (left > right) {
    return null;
    }
    int currentVal = preorder[rootIndex];
    int rootInOrderIndex = map.get(currentVal);
    TreeNode node = new TreeNode(currentVal);
    // 构建左子树
    node.left = build(rootIndex + 1, left, rootInOrderIndex - 1);
    // 构建右子树
    int rightStart = rootInOrderIndex + 1;
    int rightEnd = right;
    node.right = build(rootIndex + rightStart - left, rightStart, rightEnd);
    return node;
    }

    总结

    通过以上方法,可以高效地解决二叉搜索树的最近公共祖先问题和二叉树的重建问题。迭代法和递归法各有优劣,选择时需根据具体需求权衡。重建二叉树的分治法利用了前序和中序遍历的特性,确保了构建的准确性和效率。

    上一篇:数据结构和算法二十一
    下一篇:数据结构和算法十九

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月21日 12时47分49秒