文章目录
Leetcode236
1.问题描述
2.解决方案
解法一:万能解法
//万能解法
class Solution4 {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//1.必要的检查
if(root== nullptr) return nullptr;
//2.可以理解为对于要寻找的节点的判断
if(root==p||root==q) return root;
//3.递归调用等待结果
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
//4.根据上面的left,right 空和不空组成的四种结果进行相应的处理
if(left!= nullptr&&right!= nullptr) return root;
if(left== nullptr&&right== nullptr) return nullptr;
if(left== nullptr&&right!= nullptr) return right;
if(left!= nullptr&&right== nullptr) return left;
//5.为了通过编译实则不可能从这走
return nullptr;
}
};
解法二:深度剖析回溯万能解法
1.本题关于递归返回值的思考!!!!!
2.思路:
3.关于递归函数的深度解析:
我只能说这个真的很重要!!!虽然代码其实很好写,但是理解好了更重要,理解这句话,一切的return最初都来自于,if(root= =p||root= =q) return root/nullptr,然后将信息一层一层往上传,包括这是一个后序遍历回溯的过程也很重要!!
4.总结难点:
5.代码:
//万能解法
class Solution4 {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//1.必要的检查
if(root== nullptr) return nullptr;
//2.可以理解为对于要寻找的节点的判断
if(root==p||root==q) return root;
//3.递归调用等待结果
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
//4.根据上面的left,right 空和不空组成的四种结果进行相应的处理
if(left!= nullptr&&right!= nullptr) return root;
if(left== nullptr&&right== nullptr) return nullptr;
if(left== nullptr&&right!= nullptr) return right;
if(left!= nullptr&&right== nullptr) return left;
//5.为了通过编译实则不可能从这走
return nullptr;
}
};