LeetCode:二叉树的最近公共祖先

文章目录

  • [1. 题目介绍](#1. 题目介绍)
  • [2. 题目解析](#2. 题目解析)

1. 题目介绍


LEETCODE链接

2. 题目解析

这道题要求找到二叉树中两个结点的最近公共祖先 ,其中祖先可以是pq两个结点自身。

首先,这样的最近公共祖先一定是存在的,因为祖先可以是结点自身,那么大致可以分为以下两种情况讨论。

可以分为两种情况:

1.公共祖先不是这两个结点自身。此时,p,q两结点一定在某一个结点的左右子树中,一边一个,而这个结点就是所求的公共祖先,

  1. 公共祖先是这两个结点自身(其中之一)。此时,一定是某一个结点,在另一个结点的子树中,左子树或右子树。

所以,根据上述分析,我们可以写这样一个递归dfs,它所要完成的任务是在一棵树中,这棵树给出根结点,去尝试找到 p,q结点,如果找到p,q结点,则将相应的p,q结点返回,否则返回 nullptr ; 当然,如果在此过程中,判断找到了第一种情况中的公共结点,就返回该公共结点。

那么,在上述递归思路下,递归中所要做的事为:仅关注处理当前状态,判断当前结点情况,符合条件返回,否则进一步递归左右子树,到左右子树中去找。

cpp 复制代码
/**
 * 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* dfs(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(!root || root == p || root == q)
            return root; // root为空, p, q 时返回
        TreeNode* l = dfs(root->left, p, q);
        TreeNode* r = dfs(root->right, p, q);
        if(l && r)
            return root; // 第一种公共祖先结点情况: 返回公共祖先结点 
        return l ? l : r;  // 返回非空结点: p结点, q结点或作为第三者的公共祖先结点
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        return dfs(root, p, q);
    }
};
相关推荐
彧azz5 分钟前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外1 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
漂流瓶jz3 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
圣保罗的大教堂3 小时前
leetcode 835. 图像重叠 中等
leetcode
叠层归一研究院4 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia5 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs6666 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin036 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao7 小时前
算法50,分治归并,数组中的逆序对
java·算法
阳明山水8 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构