文章目录
万能解法模板(程序员面试金典有解释哦)!!!!!!!!
分为五个步骤
1.必要的检查
2.可以理解为对于要寻找的节点的判断(每个题变化的部分就是在于对节点的判断!!)
3.递归调用等待结果
4.根据上面的left,right 空和不空组成的四种结果进行相应的处理
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;
}
};
剑指 Offer 68 - II. 二叉树的最近公共祖先
1.问题描述
2.解决方案
直接复制万能模板即可
面试题 04.08. 首个共同祖先
1.问题描述
2.解决方案
直接复制万能模板即可
1123. 最深叶节点的最近公共祖先
1.问题描述
2.解决方案
直接套用万能模板,五步骤中只需要改动第二步,也就是改变对目标节点的判断即可
if(deep-1==recursionLayers) 这个条件就揭示了我们对目标结点的判断,其他都不用动
class Solution {
public:
//套用万能模板
TreeNode* CommonAncestor(TreeNode* root,int deep,int recursionLayers){
//1.必要的检查
if(root== nullptr) return nullptr;
//2.对要求的节点的判断
if(deep-1==recursionLayers) return root;
//3.递归等待结果
TreeNode* left=CommonAncestor(root->left,deep,recursionLayers+1);
TreeNode* right=CommonAncestor(root->right,deep,recursionLayers+1);
//4.四种情况返回
if(left!= nullptr&&right!= nullptr) return root;
if(left== nullptr&&right== nullptr) return nullptr;
if(left!= nullptr&&right== nullptr) return left;
if(left== nullptr&&right!= nullptr) return right;
//5.为了通过编译
return nullptr;
}
//recursionLayers为递归深度
int getDeep(TreeNode* root,int recursionLayers){
//空树深度
if(root== nullptr) return recursionLayers;
return max(getDeep(root->left,recursionLayers+1),getDeep(root->right,recursionLayers+1));
}
TreeNode* lcaDeepestLeaves(TreeNode* root) {
int treeDeep = getDeep(root,0);
return CommonAncestor(root,treeDeep,0);
}
};