Woodyiiiiiii / LeetCode

My private record of Leetcode solution

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LeetCode 235. Lowest Common Ancestor of a Binary Search Tree

Woodyiiiiiii opened this issue · comments

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

Given binary search tree: root = [6,2,8,0,4,7,9,null,null,3,5]
image

Example 1:

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
Output: 6
Explanation: The LCA of nodes 2 and 8 is 6.

Example 2:

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
Output: 2
Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a 
descendant of itself according to the LCA definition.

Note:

  • All of the nodes' values will be unique.
  • p and q are different and both values will exist in the BST.

因为我刚做完求二叉树最近公共祖先的问题,用同样的解法:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        return process(root, p, q);
    }
    public TreeNode process(TreeNode node, TreeNode p, TreeNode q) {
        if (node == null) return null;
        TreeNode left = process(node.left, p, q);
        TreeNode right = process(node.right, p, q);
        if (left == null && right == null) {
            if (node == p || node == q) return node;
            else return null;
        }
        else if ((left == p && right == q)
                || (left == q && right == p)
                || (node == p && (left == q || right == q))
                || (node == q && (left== p || right == p))
                )
            return node;
        else if ((left != null && right == null)
                || (left == null && right != null))
            return left == null ? right : left;
        else return null;
    }
}

注意信息汇总的逻辑要清晰。
这道题没有那么复杂,要利用二叉搜索树(BST) 这点,即 左小右大。如果当前节点比题目所给节点最小值都小,则往右子树递归;如果当前节点比题目所给节点最大值都大,则往左子树递归;否则,当前节点就是最近公共祖先。

class Solution {
    private TreeNode res = null;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        int minV = Math.min(p.val, q.val);
        int maxV = Math.max(p.val, q.val);
        process(root, minV, maxV);
        return res;
    }
    public void process(TreeNode node, int minV, int maxV) {
        if (node == null) return;
        int v = node.val;
        if (v < minV) process(node.right, minV, maxV);
        else if (v > maxV) process(node.left, minV, maxV);
        else res = node;
    }
}

非递归解法如下:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode node = root;
        if (node == null) return null;
        while (true) {
            if (node.val > Math.max(p.val, q.val)) node = node.left;
            else if (node.val < Math.min(p.val, q.val)) node = node.right;
            else break;
        }
        return node;
    }
}

参考资料:

相似题目:
236. Lowest Common Ancestor of a Binary Tree