python每日一题【剑指 Offer 68 - I. 二叉搜索树的最近公共祖先】【剑指 Offer 68 - II. 二叉树的最近公共祖先】

day37-2022.12.03

题目信息来源

作者:Krahets

链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm

来源:力扣(LeetCode)

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

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

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

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

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

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

题解:个人题解

# 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':
        def searchSameFather(node):
            if not node:return False, False
            pleft, qleft = searchSameFather(node.left)
            pright, qright = searchSameFather(node.right)
            pnode = True if node==p else False
            qnode = True if node==q else False
            left_result = (pleft or pright or pnode)
            right_result = (qleft or qright or qnode)
            if self.done==False:
                if left_result and right_result:
                    self.result = node
                    self.done = True
            return left_result, right_result
        
        self.result = None
        self.done = False
        searchSameFather(root)
        return self.result

官方题解

个人解法偷懒了一道题的方法用在了两个题的地方。

递归法:

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if p.val>q.val:p, q = q, p
        if root.val>q.val:return self.lowestCommonAncestor(root.left, p, q)
        if root.val<p.val:return self.lowestCommonAncestor(root.right, p, q)
        return root

迭代法:

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if p.val>q.val:p, q = q, p
        while root:
            if root.val>q.val:root = root.left
            elif root.val<p.val:root = root.right
            else:break
        return root

day38-2022.12.04

题目信息来源

作者:Krahets

链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm

来源:力扣(LeetCode)

剑指 Offer 68 - II. 二叉树的最近公共祖先

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

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

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

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

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

题解:个人题解

偷懒,直接时上一道题的解法,因为上一题我并没有考虑二叉搜索树的特殊性。

思路是:当前节点是 pq 的公共祖先的条件是当前节点的左右节点或者节点本身,有qp匹配上,即 (pleft or pright or pnode)==True or (qleft or qright or qnode)==True。有的话标记当前节点为 result,同时,由于最开始满足条件的节点的父节点,也会是 pq 的公共祖先,但我们需要的是最近的。所以我们需要一个标记 self.done

  • 递归参数:下一个节点 node.left or node.right
  • 返回值:bool 值,两个,是否等于 pq
    • 如果 node 为空,返回都是 False,也是终止条件
    • node 不为空,返回值取决于左右子有节点或者节点本身是否等于 pq
# 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:
        def searchSameFather(node):
            if not node:return False, False
            pleft, qleft = searchSameFather(node.left)
            pright, qright = searchSameFather(node.right)
            pnode = True if node==p else False
            qnode = True if node==q else False
            left_result = (pleft or pright or pnode)
            right_result = (qleft or qright or qnode)
            if self.done==False:
                if left_result and right_result:
                    self.result = node
                    self.done = True
            return left_result, right_result
        
        self.result = None
        self.done = False
        searchSameFather(root)
        return self.result

题解:官方题解

class Solution:
    def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
        if root==p or root==q or not root:return root
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        if not left:return right
        if not right:return left
        return root
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

piukaty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值