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);
    }
};
相关推荐
田里的水稻19 小时前
FA_规划和控制(PC)-快速探索随机树(RRT)
人工智能·算法·数学建模·机器人·自动驾驶
jaysee-sjc19 小时前
十三、Java入门进阶:异常、泛型、集合与 Stream 流
java·开发语言·算法
元亓亓亓20 小时前
LeetCode热题100--41. 缺失的第一个正数--困难
数据结构·算法·leetcode
码云数智-大飞20 小时前
.NET 10 & C# 14 新特性详解:扩展成员 (Extension Members) 全面指南
java·数据库·算法
weixin_4772716920 小时前
狗象:与强大的一方建立联系,并控制调用对方的力量。)马王堆帛书《周易》原文及甲骨文还原周朝生活现象《函谷门
算法·图搜索算法
小妖66620 小时前
js 实现归并排序算法
算法·排序算法
fu的博客20 小时前
【数据结构7】链式栈实现
数据结构·算法
xiaoye-duck20 小时前
《算法题讲解指南:优选算法-双指针》--01移动零,02复写零
c++·算法
田里的水稻20 小时前
LPC_激光点云定位(LSLAM)-(IPC)
人工智能·算法·数学建模·机器人·自动驾驶
额,不知道写啥。21 小时前
P5314 ODT(毒瘤树剖)
数据结构·c++·算法