二叉树经典题之二叉树最近公共祖先(LeetCode)
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树经典题之二叉树最近公共祖先(LeetCode)相关的知识,希望对你有一定的参考价值。
前言:
二叉树刷题是有固定思维的,请移步
文章目录
二叉树的最近公共祖先
题目
点击跳转:LeetCode
法一
思路
从题目中的描述可以发现如下规律
- 如果结点p和结点q在分别在root结点的左右子树,那么root结点便是p和q的最近公共祖先
- 如果结点p和结点q都在root结点的左子树,那么就要到左子树中寻找;相反就要去右子树中寻找
- 某次寻找时如果出现了
root==q
或root==p
的情况,例如示例中的结点5和结点4,那么此时root结点就是最近高公共祖先
代码
class Solution {
public:
bool Find(TreeNode* root,TreeNode* target)//找寻某个结点是否存在
{
if(root==nullptr)
return false;
if(root==target)
return true;
return Find(root->left,target) || Find(root->right,target);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
if(root==nullptr)
return nullptr;
if(root==p || root==q)//上图中结点5和结点4的情况
return root;
//定义4个布尔类型,用于判断p在root左面还是右面,q在root的左面还是右面
bool pInleft,pInright,qInleft,qInright;
pInleft=Find(root->left,p);
pInright=!pInleft;
qInleft=Find(root->left,q);
qInright=!qInleft;
if((pInleft && qInright) || (pInright && qInleft))//如果p和q分别在root的左(右)和右(左),那么root就是最近公共祖先
{
return root;
}
else if(pInleft && qInleft)//如果p和q在root的左面,那么就递归到左子树寻找
{
return lowestCommonAncestor(root->left,p,q);
}
else//如果p和q在root的右面,那么就递归到右子树寻找
return lowestCommonAncestor(root->right,p,q);
}
};
以上是关于二叉树经典题之二叉树最近公共祖先(LeetCode)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Java刷题笔记—236. 二叉树的最近公共祖先