LeetCode算法题(Go语言实现)_38

题目

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

一、代码实现

type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {if root == nil || root == p || root == q {return root}left := lowestCommonAncestor(root.Left, p, q)right := lowestCommonAncestor(root.Right, p, q)if left != nil && right != nil {return root}if left != nil {return left}return right
}

二、算法分析

1. 核心思路
  • 后序遍历:自底向上查找目标节点,通过递归返回值传递状态
  • 状态判断:当某个节点的左右子树分别包含目标节点时,即为LCA
2. 关键步骤
  1. 递归终止:遇到空节点或目标节点立即返回
  2. 子树搜索:分别在左右子树中查找目标节点
  3. 结果合并
    • 左右子树均有返回值 → 当前节点为LCA
    • 仅单侧有返回值 → 继续向上传递该结果
3. 复杂度
指标说明
时间复杂度O(n)每个节点遍历一次
空间复杂度O(h)递归栈空间,h为树的高度

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 节点为根节点:返回根节点
  • 节点互为祖先:返回层级更高的节点
  • 节点不在树中:返回null(需预先验证)
2. 多语言实现
class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if not root or root == p or root == q:return rootleft = self.lowestCommonAncestor(root.left, p, q)right = self.lowestCommonAncestor(root.right, p, q)return root if left and right else left or right
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null || root == p || root == q) return root;TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);return left != null && right != null ? root : left != null ? left : right;}
}

五、总结与扩展

1. 核心创新点
  • 状态传递:利用递归返回值携带子树搜索信息
  • 短路优化:发现目标节点后立即停止子树搜索
2. 扩展应用
  • 多节点LCA:扩展算法处理多个目标节点
  • 带父指针树:使用哈希表存储访问路径
  • 频繁查询优化:结合RMQ算法预处理
3. 工程优化
  • 迭代实现:用栈模拟后序遍历
  • 路径记录:显式存储节点访问路径
  • 输入验证:增加节点存在性检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 基础语法、Java注释

Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫…

用VScode来编写前后端——构建基础框架

前言 我写这一个板块的原因是我参加了我们学校的新生项目课,需要创立一个系统,我们小组选的标题的基于计算机视觉的商品识别系统,那么我们需要一个网站来展示我们的功能,故写这些来记录一下自己,大家如果有什么问题的话…

git clone阻塞问题

问题描述 git clone采用的ssh协议,在克隆仓库的时候,会经常卡一下,亦或是直接卡死不动。 最开始以为是公司电脑配置的问题,想着自己实在解决不了找it帮忙。 查阅资料发现,最终发现是git版本的问题,这个是…

WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网不回显

目录 1. RCE执行-5大类函数调用 1.1 Runtime方式 1.2 Groovy执行命令 1.3 脚本引擎代码注入 1.4 ProcessImpl 1.5 ProcessBuilder 2. JNDI注入(RCE)-RMI&LDAP&高版本 2.1 RMI服务中的JNDI注入场景 2.2 LDAP服务中的JNDI注入场景 攻击路径示例&#…

【Hadoop入门】Hadoop生态之Sqoop简介

1 什么是Sqoop? 在企业的数据架构中,关系型数据库与Hadoop生态系统之间的数据流动是常见且关键的需求。Apache Sqoop(SQL-to-Hadoop)正是为解决这一问题而生的高效工具,它专门用于在结构化数据存储(如RDBMS…

如何自动检测使用的组件库有更新

🤖 作者简介:水煮白菜王,一位前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&#…

Go语言编写一个进销存Web软件的demo

Go语言编写一个进销存Web软件的demo 用户现在要求用。之前他们已经讨论了用Django实现的方案,现在突然切换到Go,可能有几个原因。首先,用户可能对Go语言感兴趣,或者他们公司的技术栈转向了Go。其次,用户可能希望比较不…

【前缀和】矩阵区域和(medium)

矩阵区域和(medium) 题⽬描述:解法:代码Java 算法代码:C 算法代码: 题⽬描述: 题⽬链接:1314. 矩阵区域和 给你⼀个 m x n 的矩阵 mat 和⼀个整数 k ,请你返回⼀个矩阵 …

Java学习手册:Java发展历史与版本特性

Java作为全球最流行的编程语言之一,其发展历程不仅见证了技术的演进,也反映了软件开发模式的变革。从1995年的首次发布到如今的持续更新,Java始终保持着强大的生命力和广泛的影响力。本文将简要回顾Java的发展历程,并重点介绍其关…

winserver2022备份

安装备份,然后等待安装完成即可 然后可以在这里看到安装好的win server2022备份 一直下一步然后到这里 不要用本地文件夹备份 备份到远程服务器,远程服务器路径 然后确定备份即可 如何恢复呢? 点击右侧的恢复就可以了 打开任务计划程序 这…

Unity 设置弹窗Tips位置

根据鼠标位于屏幕的区域&#xff0c;设置弹窗锚点以及位置 public static void TipsPos(Transform tf) {//获取ui相机var uiCamera GetUICamera();var popup tf.GetComponent<RectTransform>();//获取鼠标位置Vector2 mousePos Input.mousePosition;float screenWidt…

【C++基础-关键字】:extern

深入理解 C++ 关键字 extern 在 C++ 编程中,extern 关键字扮演着重要角色,主要用于声明全局变量或函数,使其在多个源文件间共享。本文将详细探讨 extern 的用法及其在实际开发中的应用。 1. 什么是 extern? extern 关键字用于声明一个变量或函数的引用,表示该变量或函数…

我为女儿开发了一个游戏网站

大家好&#xff0c;我是星河。 自从协助妻子为女儿开发了算数射击游戏后&#xff0c;星河就一直有个想法&#xff1a;为女儿打造一个专属的学习游戏网站。之前的射击游戏虽然有趣&#xff0c;但缺乏难度分级&#xff0c;无法根据女儿的学习进度灵活调整。而且&#xff0c;仅仅…

基于 Python 卷积神经网络的新闻文本分类系统,附源码

大家好&#xff0c;我是徐师兄&#xff0c;一个有着7年大厂经验的程序员&#xff0c;也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。今天我来跟大家聊聊一个用 Python 和 Django 打造的人脸识别考勤系统&#xff…

ngx_cycle_modules

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_modules-CSDN博客 定义在 src/core/ngx_module.c ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle) {/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modules ngx_pcalloc(…

AI 代码生成工具如何突破 Java 单元测试效能天花板?

一、传统单元测试的四大痛点 时间黑洞&#xff1a;根据 JetBrains 调研&#xff0c;Java 开发者平均花费 35% 时间编写测试代码覆盖盲区&#xff1a;手工测试覆盖率普遍低于 60%&#xff08;Jacoco 全球统计数据&#xff09;维护困境&#xff1a;业务代码变更导致 38% 的测试用…

【保姆级图解】插入排序 算法详解:直接插入排序、希尔排序

总体引入 在计算机科学的算法领域中&#xff0c;排序是一项基础且重要的操作。它旨在将一组无序的数据元素重新排列为有序序列&#xff0c;以满足特定的顺序要求&#xff0c;如升序或降序。常见的排序算法可分为不同类别&#xff0c;像插入排序&#xff0c;包含直接插入排序和…

为什么ChatGPT选择SSE而非WebSocket?

为什么ChatGPT选择SSE而非WebSocket&#xff1f; 一、ChatGPT回答问题的技术逻辑 ChatGPT的响应生成基于Transformer架构和自注意力机制&#xff0c;其核心是通过概率预测逐词生成文本。当用户输入问题后&#xff0c;模型会先解析上下文&#xff0c;再通过预训练的庞大语料库…

Android 手机指纹传感器无法工作,如何恢复数据?

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据清除、数据备份、数据取证、数据迁移解决方案&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 天津鸿萌科贸发展有限公司是众多国…

DeepSeek 在金融领域的应用解决方案

DeepSeek 在金融领域的应用解决方案 一、背景 随着人工智能技术的快速发展&#xff0c;DeepSeek 作为一款国产大模型&#xff0c;凭借其强大的语义理解、逻辑推理和多模态处理能力&#xff0c;在金融行业迅速崭露头角。金融行业作为经济的核心&#xff0c;面临着激烈的市场竞…