lca算法,递归查询即可,如果当前结点为p或者q就返回当前结点,left等于取当前结点左子树查找的结果,right等于取右子树查找的结果,如果都不为l和r均不为空就返回root,如果左为空,那么就在右子树,就返回在右子树的查询结果即可(right),反之返回left
/**
* 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 == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right,p,q);
if(left == NULL) return right;
if(right == NULL) return left;
return root;
}
};
这道题翻车太多太多次了,如果左为空,直接返回right即可,不要再去右子树搜索了,已经搜索过了!就是right,如果右为空,直接返回left。如果均不为空,那么root就是结果
/**
* 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 || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right,p,q);
if(left == NULL) return right;
if(right == NULL) return left;
return root;
}
};
事不过三,轻松
/**
* 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 == p || root == q) return root;
TreeNode* l = lowestCommonAncestor(root->left,p,q);
TreeNode* r = lowestCommonAncestor(root->right,p,q);
if(l!=NULL && r!= NULL) return root;
return l==NULL?r:l;
}
};
四刷
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//如果为空或者等于p或者q任意一个就返回
//如果都是,就递归搜索左边和右边,如果左右均不为空,直接返回root,否则返回非空的那个
if(root == NULL || root == p || root == q) return root;
TreeNode* l = lowestCommonAncestor(root->left,p,q);
TreeNode* r = lowestCommonAncestor(root->right,p,q);
if(l != NULL && r!= NULL) return root;
return l == NULL?r:l;
}
};