二叉树经典题之二叉树最近公共祖先(LeetCode)

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树经典题之二叉树最近公共祖先(LeetCode)相关的知识,希望对你有一定的参考价值。

前言:

二叉树刷题是有固定思维的,请移步

README】二叉树刷题框架

二叉树的最近公共祖先

题目

点击跳转:LeetCode

在这里插入图片描述

法一

思路

从题目中的描述可以发现如下规律

  • 如果结点p和结点q在分别在root结点的左右子树,那么root结点便是p和q的最近公共祖先
  • 如果结点p和结点q都在root结点的左子树,那么就要到左子树中寻找;相反就要去右子树中寻找
  • 某次寻找时如果出现了root==qroot==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. 二叉树的最近公共祖先

二叉树经典题之二叉树的非递归遍历

LeetCode 236. 二叉树的最近公共祖先

LeetCode 236. 二叉树的最近公共祖先

LeetCode二叉树#16二叉树的最近公共祖先(递归后序遍历,巩固回溯机制)

Leetcode 236.二叉树的最近公共祖先