[Day32-04]-[二叉树] 二叉树的最近公共祖先
236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
复制代码
示例 2:
复制代码
示例 3:
复制代码
题解:
复制代码
本文字数:696 字
阅读完需:约 2 分钟
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
促进软件开发及相关领域知识与创新的传播
评论