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 v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______6______ / \ ___2__ ___8__ / \ / \ 0 _4 7 9 / \ 3 5For example, the lowest common ancestor (LCA) of nodes
2
and
8
is
6
. Another example is LCA of nodes
2
and
4
is
2
, since a node can be a descendant of itself according to the LCA definition.
自己用的dfs:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* lca = NULL;
int n = 0;
dfs(root, p, q, n, lca);
return lca;
}
void dfs(TreeNode* curNode, TreeNode* &p, TreeNode* &q, int &n, TreeNode* &lca){
if(n<2){
int temp = n; //满足条件的点在搜索之前要为0,
if(curNode!=NULL){
dfs(curNode->left, p, q, n, lca);
dfs(curNode->right, p, q, n, lca);
if(curNode==p) n++;
if(curNode==q) n++;
}
if(n-temp==2&&lca==NULL) lca = curNode;//搜索之后要为2,并且lca要是第一次赋值的。
}
}
};
discuss中别人写的:
使用了bst的性质,
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while((root->val - p->val) * (root->val - q->val) > 0){//大于零说明p q在当前root的某一边(同一棵子树上面)
if(root->val > p->val&&root->val > q->val) root = root->left;
if(root->val < p->val&&root->val < q->val) root = root->right;
}
return root;
}
};