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/