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);
    }
};
相关推荐
来一碗刘肉面5 小时前
栈的应用(表达式求值)
数据结构·算法
xiaowang1234shs6 小时前
怪兽轻断食技术深度测评:从断食计时引擎到AI识别算法的工程实践解析
数据库·人工智能·算法·macos·机器学习·p2p·visual studio
小果因子实验室6 小时前
量化研究--策略迁移算法1研究
算法
Web极客码7 小时前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习
程序猿乐锅7 小时前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
wabs6668 小时前
关于图论【广度优先搜索的理论基础】
算法·图论·宽度优先
孤魂2338 小时前
逻辑回归算法
算法·机器学习·逻辑回归
weixin_377634848 小时前
【多模型预测】 如何合理融合多个预测分值
算法·机器学习·概率论·预测·agent预测
无风听海8 小时前
Claude Agent Skills 的四种设计模式;从渐进式披露到最小权限
java·算法·设计模式