[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,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!

促进软件开发及相关领域知识与创新的传播
京公网安备 11010502039052号

评论