给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
思路:根据二叉搜索树的性质(左子树的子树一定都小于当前节点,右子树的子树一定都大于当前节点),如果p,q的数值都小于当前节点x(x比p,q都要大),则向左遍历。如果p,q的数值都大于当前节点x(x比p,q都小),则向右遍历。当碰到冲突节点(p<x<q 或者q<x<p)则当前节点一定是祖先节点,返回当前节点即可。
代码
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* cur, TreeNode* p, TreeNode* q) {
if (cur == NULL)return cur; //节点为空
if (cur->val > p->val && cur->val > q->val) {
TreeNode*Left= lowestCommonAncestor(cur->left, p, q); //接收冲突节点(祖先节点)
if (Left != NULL) { //节点不为空,表示已经找到冲突节点
return Left; //直接返回
}
}
if (cur->val<p->val &&cur->val<q->val) {
TreeNode* Right = lowestCommonAncestor(cur->right, p, q);
if (Right != NULL) { //节点不为空,表示已经找到冲突节点
return Right; //直接返回;
}
}
return cur; //冲突节点 p<x<q 或者q<x<p,直接返回
}
};