树 之 二叉搜索树中节点的最近公共祖先

580 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

这个题目说的是,给你一棵二叉搜索树以及树中两个节点,你要找到这两个节点的最近公共祖先,然后将它返回。注意,树上所有的节点值都不相同。

比如说,给你的二叉搜索树为:

      4
    /   \
   2     5
  / \     \
 1   3     6

节点 1 和 3 的最近公共祖先是节点 2;
节点 3 和 6 的最近公共祖先是节点 4;
节点 4 和 6 的最近公共祖先也是节点 4。

二、思路分析:

目标:找到目标节点。

因为搜索树有规则,所以相对比较好找。

思路步骤:

  1. 目标值均大于 或 小于根节点,继续迭代下去
  2. 目标值不均大于或小于根节点,则返回根节点

方法:

  1. 递归方法
  2. 迭代方法

三、AC 代码:

public class LeetCode_105 {

     // 方法一:递归方法
    // Time: O(h), Space: O(h), Faster: 100%
    public TreeNode lcaRecursive(TreeNode root, TreeNode p, TreeNode q) {
        if (p.val < root.val && q.val < root.val)
            return lcaRecursive(root.left, p, q);
        else if (p.val > root.val && q.val > root.val)
            return lcaRecursive(root.right, p, q);
        else return root;
    }

    // 方法二:迭代方法
    // Time: O(h), Space: O(1), Faster: 12.12%
    public TreeNode lcaIterative(TreeNode root, TreeNode p, TreeNode q) {
        while (root != null) {
            if (p.val < root.val && q.val < root.val) root = root.left;
            else if (p.val > root.val && q.val > root.val) root = root.right;
            else return root;
        }
        return null;
    }
}

四、总结:

充分掌握树的性质。