Lowest common ancestor of a BST

。題目假設

給定一個 BST,以及兩個點 p, q,找出這兩個點的最低公共祖先

題目假設這兩點一定存在在 BST 裡

。直覺

用遞迴找出

。分析可行性(資結、演算法、虛擬碼)

可以在遞迴時用條件去找出當前的點是不是 p, q 的祖先

。最後解決方案

。反饋:與一開始想的不一樣的地方、需改進的想法

一開始我很注重在 root 跟左右的關係,後來發現題目是要找 p, q 的祖先

而且題目是給一個 BST, BST 的特性是 left.val < root.val < right.val ,

因此只要看看當前的 root 是不是介於 p, q 之間,

如果 root 比 p, q 都大,表示 p, q 都在左子樹,遞迴往 root.left 走

如果 root 比 p, q 都小,表示 p, q 都在右子樹,遞迴往 root.right 走

需改進的地方是:要先想起 BST 的特性

。複雜度

遞迴找到祖先,每次都是往左或往右,因此是 O(log n)

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if (root == null || p == null || q == null) {
        return root;
    }

    if (root.val > p.val && root.val > q.val) {
        return lowestCommonAncestor(root.left, p, q);
    } else if (root.val < p.val && root.val < q.val) {
        return lowestCommonAncestor(root.right, p, q);
    } else {
        return root;
    }
}

results matching ""

    No results matching ""