题干:
代码:
class Solution {递归实现
public:
TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){
if(root == NULL)return NULL;
if(root->val > p->val && root->val > q->val){
TreeNode* left = traversal(root->left, p, q);
if(left != NULL)return left;
}
if(root->val < p->val && root->val < q->val){
TreeNode* right = traversal(root->right, p, q);
if(right != NULL)return right;
}
return root;//你往左也不是,往右也不是,就直接返回。
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL)return NULL;
return traversal(root,p,q);
}
};
class Solution {//迭代实现
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL)return NULL;
while(root){
if(root->val > p->val && root->val > q->val){
root = root->left;
}
else if(root->val < p->val && root->val < q->val){
root = root->right;
}
else return root;
}
return root;
}
};
在二叉树:公共祖先问题 中,如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树。
搜索一条边的写法:
if (递归函数(root->left)) return ;
if (递归函数(root->right)) return ;
搜索整个树写法:
left = 递归函数(root->left);
right = 递归函数(root->right);
left与right的逻辑处理;