[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.html

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).」node

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

 

Example 1:github

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

Example 2:post

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

 

Note:url

  • 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都在右子樹中,那麼此時咱們就進入根節點的右子節點繼續遞歸,若是都不是,則說明當前根節點就是最小共同父節點,直接返回便可,參見代碼以下:spa

 

解法一:code

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 循環來代替遞歸調用便可,而後不停的更新當前的根節點,也能實現一樣的效果,代碼以下:htm

 

解法二:blog

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 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索