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

题目

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

一、代码实现

go 复制代码
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. 多语言实现
python 复制代码
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
java 复制代码
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. 工程优化
  • 迭代实现:用栈模拟后序遍历
  • 路径记录:显式存储节点访问路径
  • 输入验证:增加节点存在性检查
相关推荐
老马啸西风7 分钟前
Neo4j GDS-09-neo4j GDS 库中路径搜索算法实现
网络·数据库·算法·云原生·中间件·neo4j·图数据库
Go高并发架构_王工33 分钟前
基于 GoFrame 框架的电子邮件发送实践:优势、特色与经验分享
网络·经验分享·golang
xiongmaodaxia_z738 分钟前
python每日一练
开发语言·python·算法
Chandler241 小时前
Go:接口
开发语言·后端·golang
ErizJ1 小时前
Golang|Channel 相关用法理解
开发语言·后端·golang
automan021 小时前
golang 在windows 系统的交叉编译
开发语言·后端·golang
Pandaconda1 小时前
【新人系列】Golang 入门(十三):结构体 - 下
后端·golang·go·方法·结构体·后端开发·值传递
zy_destiny1 小时前
【非机动车检测】用YOLOv8实现非机动车及驾驶人佩戴安全帽检测
人工智能·python·算法·yolo·机器学习·安全帽·非机动车
rigidwill6662 小时前
LeetCode hot 100—搜索二维矩阵
数据结构·c++·算法·leetcode·矩阵