[LeetCode] 235. Lowest Common Ancestor of a Binary Search Tree 二叉搜索樹的最小共同父節點


 

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]

 

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.

 

這道題讓我們求二叉搜索樹的最小共同父節點, LeetCode中關於BST的題有 Validate Binary Search Tree, Recover Binary Search Tree, Binary Search Tree Iterator, Unique Binary Search Trees, Unique Binary Search Trees IIConvert Sorted Array to Binary Search Tree , Convert Sorted List to Binary Search Tree 和 Kth Smallest Element in a BST。這道題我們可以用遞歸來求解,我們首先來看題目中給的例子,由於二叉搜索樹的特點是左<根<右,所以根節點的值一直都是中間值,大於左子樹的所有節點值,小於右子樹的所有節點值,那么我們可以做如下的判斷,如果根節點的值大於p和q之間的較大值,說明p和q都在左子樹中,那么此時我們就進入根節點的左子節點繼續遞歸,如果根節點小於p和q之間的較小值,說明p和q都在右子樹中,那么此時我們就進入根節點的右子節點繼續遞歸,如果都不是,則說明當前根節點就是最小共同父節點,直接返回即可,參見代碼如下:

 

解法一:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root) return NULL;
        if (root->val > max(p->val, q->val)) 
            return lowestCommonAncestor(root->left, p, q);
        else if (root->val < min(p->val, q->val)) 
            return lowestCommonAncestor(root->right, p, q);
        else return root;
    }
};

 

當然,此題也有非遞歸的寫法,用個 while 循環來代替遞歸調用即可,然后不停的更新當前的根節點,也能實現同樣的效果,代碼如下:

 

解法二:

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

 

Github 同步地址:

https://github.com/grandyang/leetcode/issues/235

 

類似題目:

Lowest Common Ancestor of a Binary Tree

 

參考資料:

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/discuss/64980/C%2B%2B-Recursive-and-Iterative

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/discuss/64963/3-lines-with-O(1)-space-1-Liners-Alternatives

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM