题目
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中 最近公共祖先 的定义为: 对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
例如,给定如下二叉树: root = [3, 5, 1, 6, 2, 0, 8, null, null, 7, 4]
示例 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。因为根据定义最近公共祖先节点可以为节点本身。
说明:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉树中。
方案一(递归)
/**
* Definition for TreeNode.
* type TreeNode struct {
* Val int
* Left *ListNode
* Right *ListNode
* }
*/
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root == nil {
return root
}
if root.Val == p.Val || root.Val == q.Val {
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 right
}
if right == nil { // 目标节点只在左边
return left
}
return nil
}
python 版本——2020-04-05
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return None
if root.val == p.val or root.val == q.val: # 示例2的情况
return root
left = self.lowestCommonAncestor(root.left, p, q) # 左侧寻找公共祖先
right = self.lowestCommonAncestor(root.right, p, q) # 右侧寻找公共祖先
if left and right: # 公共祖先在两侧
return root
return left or right # 三种情况分别为,公共祖先在左侧或右侧
原文
https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/4/conclusion/19/