1. 程式人生 > >LeetCode演算法題-Lowest Common Ancestor of a Binary Search Tree

LeetCode演算法題-Lowest Common Ancestor of a Binary Search Tree

這是悅樂書的第197次更新,第203篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第59題(順位題號是235)。給定二叉搜尋樹(BST),找到BST中兩個給定節點的最低共同祖先(LCA)。根據維基百科上LCA的定義:“最低共同祖先在兩個節點p和q之間定義為T中的最低節點,其中p和q都是後代(我們允許節點成為其自身的後代)。”

給定二叉搜尋樹:root = [6,2,8,0,4,7,9,null,null,3,5]

            6
          /   \
         2     8
        / \   / \
        0  4  7  9
          / \
         3   5

例如:

輸入:root = [6,2,8,0,4,7,9,null,null,3,5],p = 2,q = 8

輸出:6

說明:節點2和8的LCA為6。


輸入:root = [6,2,8,0,4,7,9,null,null,3,5],p = 2,q = 4

輸出:2

說明:節點2和4的LCA是2,因為節點可以是其自身的後代,根據LCA的定義。

注意:

  • 所有節點的值都是唯一的。

  • p和q不同,兩個值都將存在於BST中。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

利用迭代的方法。二叉搜尋樹的特點是 左節點的值 < 根節點的值 < 右節點的值,如果p和q的節點值都小於當前節點,此時指標應該移動到當前節點的左節點,再去比較。如果p和q的節點值都大於當前節點,此時指標應該移動到當前節點的右節點,再去比較。否則就返回當前節點。

public TreeNode lowestCommonAncestor(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 root;
}


03 第二種解法

利用遞迴的方法,判斷邏輯和迭代的解法一樣。如果當前節點的值比p和q中最大值都要大,因為當前節點的左子節點值肯定小於當前節點的值,所以要往當前節點的左子節點方向移動。如果當前節點的值比p和q中最小值都要小,因為當前節點的右子節點值肯定大於當前節點的值,所以要往當前節點的右子節點方向移動。然後再去判斷。

public TreeNode lowestCommonAncestor2(TreeNode root, TreeNode p, TreeNode q) {
    if (root == null) {
        return null;
    }
    if (root.val > Math.max(p.val, q.val)) {
        return lowestCommonAncestor2(root.left, p, q);
    }
    if (root.val < Math.min(p.val, q.val)) {
        return lowestCommonAncestor2(root.right, p, q);
    }
    return root;
}


04 小結

演算法專題目前已連續日更超過一個月,演算法題文章59+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!