根据题意,这是一棵二叉搜索树,那么我们遍历时可以利用其特点。如果当前遍历的节点大于p和q,那么只需要遍历该节点的左子树,反之遍历右子树。如果这个节点的数值介于p和q之间,那么该节点就是最近公共祖先。为什么呢?因为p和q在不同的子树,我们如果取别的节点为祖先,根本不可能连接p,q,只能是当前这个介于p,q之间的父节点。这只是大体思路,大家可以结合下面的代码及注释加以理解。
代码及注释如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//终止条件
if(root == NULL) return NULL;
//根据大小判断是进行左递归还是右递归
if(root -> val > p -> val && root -> val > q -> val){
TreeNode* a = lowestCommonAncestor(root -> left,p,q);
if(a != NULL) return a;//递归函数返回值不为空,说明找到了符合要求的节点,立即返回
}
if(root -> val < p -> val && root -> val < q -> val){
TreeNode* b = lowestCommonAncestor(root -> right,p,q);
if(b != NULL) return b;//递归函数返回值不为空,说明找到了符合要求的节点,立即返回
}
//这一步可以理解为处理逻辑,表示当前节点符合题意,直接返回
return root;
}
};
143

被折叠的 条评论
为什么被折叠?



