iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
佛心分享-刷題不只是刷題

刷經典 LeetCode 題目系列 第 19

經典LeetCode 235. Lowest Common Ancestor of a Binary Search Tree

  • 分享至 

  • xImage
  •  

題目:
給定一棵二元搜尋樹 (BST),和樹中的兩個節點 pq,請找出這兩個節點的最近共同祖先 (Lowest Common Ancestor, LCA)。

根據BST的性質,父節點的值大於左子節點且小於右子節點。

範例:
範例 1:

輸入:root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
      6
     / \
    2   8
   / \ / \
  0  4 7  9
    / \
   3   5
輸出:6
解釋:節點 2 和節點 8 的最近共同祖先是 6。

範例 2:

輸入:root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
      6
     / \
    2   8
   / \ / \
  0  4 7  9
    / \
   3   5
輸出:2
解釋:節點 2 和節點 4 的最近共同祖先是 2,因為根據定義,最近共同祖先可以是節點本身。

提示

  • 給定的樹是 BST。
  • 所有節點的值唯一。
  • pq 的值保證在 BST 中都存在。

解題思路

對於 pq 與當前節點有三種情況,

  • 如果 pq 的值都小於當前節點,表示它們都在當前節點的左子樹,所以應該往左走。
  • 如果 pq 的值都大於當前節點,則表示它們都在右子樹,因此應該往右走。
  • 如果一個節點的值介於 pq 之間,或者與其中之一相等,那麼當前節點就是它們的最近共同祖先。

遞迴版本

實作:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (p->val < root->val && q->val < root->val) { // left
            // 如果 p 和 q 的值都小於當前節點,往左子樹繼續尋找
            return lowestCommonAncestor(root->left, p, q);
        } else if (p->val > root->val && q->val > root->val) { // right
            // 如果 p 和 q 的值都大於當前節點,往右子樹繼續尋找
            return lowestCommonAncestor(root->right, p, q);
        } else { // p->val <= root->val && q->val => root->val
            // 找到最近共同祖先
            return root;
        }
    }
};

在這邊不會遍歷到 nullptr 節點。

迭代版本

實作:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        while (root != nullptr) {
            if (p->val < root->val && q->val < root->val) { // left
                // 如果 p 和 q 的值都小於當前節點,往左子樹繼續尋找
                root = root->left;
            } else if (p->val > root->val && q->val > root->val) { // right
                // 如果 p 和 q 的值都大於當前節點,往右子樹繼續尋找
                root = root->right;
            } else { // p->val <= root->val && q->val => root->val
                // 找到最近共同祖先
                return root;
            }
        }
        return nullptr;
    }
};

小筆記:

  • 這題難在怎麼想到這個方法,如果樹的遍歷方式還熟悉的話,實作是蠻簡單的。
  • BST特性:所有節點的值都是唯一不重複,父節點的值大於左子節點且小於右子節點。

參考:
#235. Lowest Common Ancestor of a BST


上一篇
經典LeetCode 98. Validate Binary Search Tree
下一篇
經典LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
系列文
刷經典 LeetCode 題目37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言