LeetCode:236. Lowest Common Ancestor of a Binary Tree - Python

问题描述:

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

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

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

    _______3______
   /              \
 ___5__          ___1__
/      \        /      \
6      _2      0        8
      /  \
     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为不同节点且均存在于给定的二叉树中。

问题分析:

(1)如果p、q两个节点在同一分支上,很显然只要返回最上面那个即可。
(2)如果p、q两个节点不在同一分支上,很显然,返回父节点即可。
(3)使用递归方法,如果当前节点与p、q两个节点有一个相同就返回,其一。
(4)左右深度递归二叉树。
(5)最后判断左右两个分支返回值,如果都不为None,说明当前节点,就是最近父节点,如果有一个为None说明,现在还不确定,那么就继续返回那个不为None的节点。如果都为None,说明这个分支上没找到。

Python3实现:

class Solution:
    def lowestCommonAncestor(self, root, p, q):
        if root in (None, p, q):  # 判断是否找到
            return root

        left = self.lowestCommonAncestor(root.left, p, q)  # 左右深度递归
        right = self.lowestCommonAncestor(root.right, p, q)

        if left and right:  # 两个节点都找到
            return root
        else:
            return left or right  # 找到其中一个

        return None  # 都没找到(加不加都行,加上严谨点)

声明: 总结学习,有问题可以批评指正,大神可以略过哦。

猜你喜欢

转载自blog.csdn.net/XX_123_1_RJ/article/details/82253978