python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先

这篇具有很好参考价值的文章主要介绍了python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相关推荐
python coding with ChatGPT 打卡第12天| 二叉树:理论基础
python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历
python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历
python coding with ChatGPT 打卡第15天| 二叉树:翻转二叉树、对称二叉树
python coding with ChatGPT 打卡第16天| 二叉树:完全二叉树、平衡二叉树、二叉树的所有路径、左叶子之和
python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和
python coding with ChatGPT 打卡第18天| 二叉树:从中序与后序遍历序列构造二叉树、最大二叉树
python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树
python coding with ChatGPT 打卡第20天| 二叉搜索树:搜索、验证、最小绝对差、众数

二叉树的最近公共祖先

Key Points

  • 后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。
  • 判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。

相关题目

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

视频讲解

自底向上查找,有点难度

重点分析

方法一:递归法

  1. 递归的终止条件:
  • 遇到空的话,因为树都是空了,所以返回空。
  • 如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到
  1. 单层处理逻辑:
  • 如果left 和 right都不为空,说明此时root就是最近公共节点。这个比较好理解
  • 如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。
def lowestCommonAncestor(root, p, q):
    if not root:
        return root
    if root == p or root == q:
        return root
    left = lowestCommonAncestor(root.left, p, q)
    right = lowestCommonAncestor(root.right, p, q)
    if left and right:
        return root
    if left:
        return left
    if right:
        return right
    return None

python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先,Python Coding with ChatGPT,python,chatgpt,开发语言,leetcode,算法,数据结构

评价:
直接使用一次遍历来找到最近公共祖先会更高效。这种方法不需要存储所有父节点的路径,而是利用递归在回溯过程中直接找到LCA。

方法二:递归法
首先为每个节点找到其所有的父节点,然后比较这两个列表来找到最近的公共父节点

def find_all_father(root, p):
    res = []
    def find_father(root, p):
        if not root:
            return False
        if root == p or find_father(root.left, p) or find_father(root.right, p):
            res.append(root)
            return True
        return False
    find_father(root, p)
    return res

def lowestCommonAncestor(root, p, q):
    res1 = find_all_father(root, p)
    res2 = find_all_father(root, q)
    for i in res1:
        for j in res2:
            if i == j:
                return i

评价:
对于每个节点p和q,你的方法都会遍历整棵树来找到它们的所有父节点。这意味着树被遍历了两次。此外,对于找到的每对父节点,你使用了双层循环来比较它们,这会导致效率低下,尤其是在大树上。

方法三:迭代法
python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先,Python Coding with ChatGPT,python,chatgpt,开发语言,leetcode,算法,数据结构

def lowestCommonAncestor(root, p, q):
    # 字典用于保存每个节点的父节点
    parent = {root: None}
    stack = [root]
    
    # 迭代遍历树,直到找到p和q
    while p not in parent or q not in parent:
        node = stack.pop()
        if node.left:
            parent[node.left] = node
            stack.append(node.left)
        if node.right:
            parent[node.right] = node
            stack.append(node.right)
    
    # 通过父节点字典构建p到根节点的路径
    ancestors = set()
    while p:
        ancestors.add(p)
        p = parent[p]
    
    # 检查q到根节点的路径中第一个出现在p路径集合中的节点
    while q not in ancestors:
        q = parent[q]
    return q

这个代码首先使用一个栈和一个字典来迭代遍历整棵树并记录每个节点的父节点。然后,它构建了从p到根节点的路径并保存在一个集合中。最后,它追溯q到根节点的路径,直到找到第一个也出现在p的路径集合中的节点。这个节点就是p和q的最近公共祖先。

评价:
这个方法避免了递归,但需要额外的存储空间来记录父节点信息,并且需要两次遍历:一次是构建父节点的映射,一次是构建从目标节点到根节点的路径。

二叉搜索树的最近公共祖先

Key Points

在二叉搜索树(BST)中找到两个指定节点的最近公共祖先(LCA)比在普通二叉树中要简单,因为你可以利用BST的性质:对于任何节点,左子树上的所有节点的值都小于该节点的值,右子树上的所有节点的值都大于该节点的值。这个性质允许我们使用迭代或递归的方式来快速定位LCA,而不需要像在普通二叉树中那样存储父节点或递归遍历整个树。

相关题目

235. 二叉搜索树的最近公共祖先

视频讲解

二叉搜索树找祖先

重点分析

方法一:递归

def lowestCommonAncestor(root, p, q):
    if p.val > root.val and q.val > root.val:
        return lowestCommonAncestor(root.right, p, q)
    if p.val < root.val and q.val < root.val:
        return lowestCommonAncestor(root.left, p, q)
    return root

python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先,Python Coding with ChatGPT,python,chatgpt,开发语言,leetcode,算法,数据结构

方法二:迭代法文章来源地址https://www.toymoban.com/news/detail-832666.html

def lowestCommonAncestor(root, p, q):
    while root:
        if p.val < root.val and q.val < root.val:
            root = root.left
        elif p.val > root.val and q.val > root.val:
            root = root.right
        else:
            return root

到了这里,关于python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode(力扣)236. 二叉树的最近公共祖先Python

    https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

    2024年02月10日
    浏览(26)
  • DAY23:二叉树(十三)二叉树的最近公共祖先+二叉搜索树的最近公共祖先

    一定要仔细看 提示 ,二叉树 数值不重复 ,意味着后序遍历不会存在两边找到了同个元素的情况 本题需要进一步理解后序遍历, 可以认为后序遍历在\\\"深入\\\"到每个子树的最深层之后,才开始\\\"回溯\\\"并访问节点 。 在某种意义上,这可以被视为从下往上的遍历方式 , 但需要注

    2024年02月09日
    浏览(33)
  • 【数据结构】二叉树篇|超清晰图解和详解:二叉树的最近公共祖先

    博主简介: 努力学习的22级计算机科学与技术本科生一枚🌸 博主主页: @是瑶瑶子啦 每日一言🌼: 你不能要求一片海洋,没有风暴,那不是海洋,是泥塘——毕淑敏 🔗236. 二叉树的最近公共祖先 注意:祖先是 包括自身 的! 🍊首先要明白,当 root为p,q的最近祖先节点 ,只

    2024年02月12日
    浏览(40)
  • 力扣236——二叉树的最近公共祖先

    祝大家新年快乐呀,虽这段时间正值过年,但是我们不要忘记停下学习的脚步。今天我们一起看一到力扣上的经典二叉树OJ题,求二叉树两个结点最近的公共祖先。 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 链接给大家放在这里啦,大家一点即达 首先我们

    2024年02月20日
    浏览(32)
  • leetcode 236. 二叉树的最近公共祖先

            这道题是道面试高频题,并且有点抽象。         首先确定终止条件。如果根节点为空,或者其中一个节点是根节点本身(即 p == root 或 q == root ),那么根节点就是它们的最低共同祖先,因此我们直接返回根节点 root 。          接下来,递归调用 lowestComm

    2024年02月15日
    浏览(27)
  • leetcode热题100. 二叉树的最近公共祖先

    Problem: 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先

    2024年01月19日
    浏览(29)
  • Java——二叉树的最近公共祖先及二叉搜索树介绍

    目录 二叉树的最近公共祖先 题目  思路一:如果给定的是一颗二叉搜索树, 思路二:假设是孩子双亲表示法  二叉搜索树 定义Node类 查找 删除 插入 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点

    2023年04月08日
    浏览(28)
  • 二叉树OJ题进阶(二叉树层序遍历、根据二叉树创建字符串、判断完全二叉树、二叉树的构建及遍历、二叉树的最近公共祖先(2种))

    1.思路 用队列写: 1.从上到下,从左到右的顺序 2.非递归的方法:使用队列来完成 3.cur充当根结点,当cur不为空的时候,cur进入队列,队列不为空,cur弹出队列打印 4.如果cur的左边不为空,左边进队,右边不为空,右边进队 5.此时队列不为空,弹出队头(也就是cur的左边)打

    2024年02月05日
    浏览(31)
  • Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍     文章目录         1.0 平衡二叉树         1.1 实现判断平衡二叉树的思路         1.2 代码实现判断平衡二叉树         2.0 二叉树的层序遍历         2.1 实现二叉树层序遍历的思路          2.2

    2024年02月05日
    浏览(35)
  • 236. 二叉树的最近公共祖先 ——【Leetcode每日一题】

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

    2023年04月26日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包