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

文章目录

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

1. 题目介绍


LEETCODE链接

2. 题目解析

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

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

可以分为两种情况:

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);
    }
};
相关推荐
aqiu1111112 小时前
【C++算法打怪专栏】8. 字符串转换整数 (atoi)
开发语言·c++·算法
信奥卷王10 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵10 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
徐小黑ACG12 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z12 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
北极有牛13 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记13 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序13 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室13 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法