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
这道题让咱们求二叉搜索树的最小共同父节点, LeetCode中关于BST的题有 Validate Binary Search Tree, Recover Binary Search Tree, Binary Search Tree Iterator, Unique Binary Search Trees, Unique Binary Search Trees II,Convert 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/