当前位置: 首页 > news >正文

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

题目

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

一、代码实现

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *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 root
        left = 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. 工程优化
  • 迭代实现:用栈模拟后序遍历
  • 路径记录:显式存储节点访问路径
  • 输入验证:增加节点存在性检查

相关文章:

  • 网上购物商城网站seo长沙
  • 国内做的比较大的外贸电商网站昭通网站seo
  • 天津网站推广优化南昌seo排名
  • 网站页面的滑动怎么做武汉seo主管
  • 怎么装wordpress优化网站搜索排名
  • 沙河企业做网站网络营销最火的案例
  • 【01BFS】# P4667 [BalticOI 2011] Switch the Lamp On 电路维修 (Day1)|普及+
  • React Native (RN)的学习上手教程
  • datagrip如何连接数据库
  • 驱动开发硬核特训 · Day 7:深入掌握 Linux 驱动资源管理机制(Resource Management)
  • BOE(京东方)旗下控股子公司“京东方能源”成功挂牌新三板 以科技赋能零碳未来
  • docker的安装使用0废话版本自学软硬件工程师778天
  • CExercise_09_2动态拼接字符串_1字符串拼接
  • 图像处理中的梯度计算、边缘检测与凸包特征分析技术详解
  • 衣橱管理助手系统(衣服推荐系统)(springboot+ssm+vue+mysql)含运行文档
  • Spark-SQL 之 Window
  • 算法题型讲解
  • Ubuntu安装Docker引擎
  • SD + Contronet,扩散模型V1.5+约束条件后续优化:保存Canny边缘图,便于视觉理解——stable diffusion项目学习笔记
  • Java学习总结-TCP通信-支持与多个客户端同时通信
  • 园区网拓扑作业
  • CSP认证准备第二天-第36/37次CCF认证
  • 3.IS-IS认证
  • 2143 最少刷题数
  • 【MySQL 删除数据详解】
  • H.264 NVMPI解码性能优化策略