写点什么

[Day32-04]-[二叉树] 二叉树的最近公共祖先

作者:方勇(gopher)
  • 2022 年 5 月 01 日
  • 本文字数:696 字

    阅读完需:约 2 分钟

236. 二叉树的最近公共祖先

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

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

 

示例 1:


输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
复制代码

示例 2:


输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4输出:5解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
复制代码

示例 3:

输入:root = [1,2], p = 1, q = 2输出:1
复制代码

题解:

func TestLowestCommonAncestor(t *testing.T) {	var root = &TreeNode{		Val: 2,		Left: &TreeNode{			Val: 1,			Left: &TreeNode{				Val: 4,			},			Right: &TreeNode{				Val: 5,			},		},		Right: &TreeNode{			Val: 3,		},	}	// 题解:	// 这里需要采用后序遍历 LRD, 这样第一次出现公共节点一定是最近的公共节点	var dfs func(root, p, q *TreeNode) *TreeNode	dfs = func(root, p, q *TreeNode) *TreeNode {		if root == nil { // 递归终止条件			return nil		}		if root == p || root == q { // 只要找到了一个就得返回			return root		}		l := dfs(root.Left, p, q)		r := dfs(root.Right, p, q)		if l != nil && r != nil { // p,q一定是分散在root的左右的			return root		}		if l == nil { // 右侧找到了			return r		}		return l // 左侧找到了	}	res := dfs(root, root.Left.Left, root.Right)	t.Log(res)}
复制代码


用户头像

Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入

我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!

评论

发布
暂无评论
[Day32-04]-[二叉树]二叉树的最近公共祖先_LeetCode_方勇(gopher)_InfoQ写作社区