给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
二叉搜索树的特性是left < parent < right.
对树进行遍历,当遇到一个节点n,它的值在两个输入节点的值之间,那么这个节点就是最近公共祖先。
为什么?
因为此时,两个节点已经分居n的左右两个子树,也就是不在n的同一颗子树中,所以n的子节点不可能是两个节点的公共祖先。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* node = root;
while (node) {
if ((node->val <= p->val && node->val >= q->val) ||
(node->val >= p->val && node->val <= q->val)) {
return node;
}
if (node->val >= p->val && node->val >= q->val)
node = node->left;
else
node = node->right;
}
return nullptr;
}
};
上面的代码还不够简洁,下面的更好:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* node = root;
while (node) {
if (node->val > p->val && node->val > q->val)
node = node->left;
else if (node->val < p->val && node->val < q->val)
node = node->right;
else
return node;
}
return nullptr;
}
};