[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 题目讲解汇总(持续更新中...)

相关文章
相关标签/搜索