首页 > 编程语言 >Python算法——最近公共祖先

Python算法——最近公共祖先

时间:2023-12-24 17:33:57浏览次数:30  
标签:right TreeNode Python 祖先 算法 root 节点 left

Python中的最近公共祖先(Lowest Common Ancestor,LCA)算法详解

最近公共祖先(Lowest Common Ancestor,LCA)是二叉树中两个节点的最低共同祖先节点。在本文中,我们将深入讨论最近公共祖先问题以及如何通过递归算法来解决。我们将提供Python代码实现,并详细说明算法的原理和步骤。

最近公共祖先问题

给定一个二叉树和两个节点p、q,找到这两个节点的最近公共祖先。

递归算法求解最近公共祖先

递归算法是求解最近公共祖先问题的一种常见方法。从根节点开始,递归地遍历左右子树,查找包含节点p和节点q的最小子树。递归的终止条件是遇到null节点或找到节点p或节点q。

class TreeNode:
    def __init__(self, value):
        self.val = value
        self.left = None
        self.right = None

class Solution:
    def lowest_common_ancestor(self, root, p, q):
        if not root or root == p or root == q:
            return root

        left_lca = self.lowest_common_ancestor(root.left, p, q)
        right_lca = self.lowest_common_ancestor(root.right, p, q)

        if left_lca and right_lca:
            return root
        return left_lca or right_lca
示例

考虑以下二叉树:

3

/ \ 5 1 / \ / \ 6 2 0 8 / \ 7 4

# 构建二叉树
root = TreeNode(3)
root.left = TreeNode(5)
root.right = TreeNode(1)
root.left.left = TreeNode(6)
root.left.right = TreeNode(2)
root.right.left = TreeNode(0)
root.right.right = TreeNode(8)
root.left.right.left = TreeNode(7)
root.left.right.right = TreeNode(4)

sol = Solution()
p = root.left
q = root.right
lca = sol.lowest_common_ancestor(root, p, q)
print("节点 {} 和节点 {} 的最近公共祖先是节点 {}".format(p.val, q.val, lca.val))

输出结果:

节点 5 和节点 1 的最近公共祖先是节点 3

这表示在给定的二叉树中,节点5和节点1的最近公共祖先是节点3。递归算法在解决最近公共祖先问题时具有简洁而高效的特性。通过理解算法的原理和实现,您将能够更好地处理树结构问题。

标签:right,TreeNode,Python,祖先,算法,root,节点,left
From: https://blog.51cto.com/u_16295743/8956201

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (163)-- 算法导论13.1 3题
    三、用go语言,定义一棵松弛红黑树(relaxedred-blacktree)为满足红黑性质1、3、4和5的二叉搜索树。换句话说,根结点可以是红色或是黑色。考虑一棵根结点为红色的松弛红黑树T。如果将T的根结点标为黑色而其他都不变,那么所得到的是否还是一棵红黑树?文心一言:是的,如果将一棵根结......
  • Python从入门到实践project Web 应⽤程序 Django ⼊门.2
    projectWeb应⽤程序Django⼊门1.创建网页:学习笔记主页2.创建其他网页创建网页:学习笔记主页映射URLfromdjango.urlsimportpath,includepath('',include('learning_logs.urls')),"""定义learning_logs的URL模式"""fromdjango.urlsimportpath......
  • SciTech-Python-编译Python的C/C++扩展的setup.py
    https://github.com/google-deepmind/tree/setup.py"""Setupforpippackage."""importos,platform,sys,sysconfig,shutil,subprocess,setuptoolsfromsetuptools.commandimportbuild_exthere=os.path.dirname(os.path.abspath......
  • 文心一言 VS 讯飞星火 VS chatgpt (163)-- 算法导论13.1 3题
    三、用go语言,定义一棵松弛红黑树(relaxedred-blacktree)为满足红黑性质1、3、4和5的二叉搜索树。换句话说,根结点可以是红色或是黑色。考虑一棵根结点为红色的松弛红黑树T。如果将T的根结点标为黑色而其他都不变,那么所得到的是否还是一棵红黑树?文心一言:是的,如果将一棵根......
  • RIPEMD加密算法:原理、应用与安全性
    一、引言在信息时代,数据安全愈发受到重视,加密算法作为保障信息安全的关键技术,其性能和安全性备受关注。RIPEMD(RACEIntegrityPrimitivesEvaluationMessageDigest)加密算法作为一种著名的哈希函数,广泛应用于网络安全、数据完整性等领域。本文将从各个方面介绍RIPEMD加密算......
  • Python教程(17)——python模块是什么?python模块详解
    Python模块简介模块是一个包含了Python定义和语句的文件,可用于将功能组织成可重用和可维护的代码块。每个Python文件都可以作为一个模块,模块可以包含变量、函数、类或可执行代码。通过使用模块,我们可以将代码分离成逻辑单元,促进模块化编程。所以我们可以简单的理解为,一个py文件就......
  • STL常用泛型算法
    2STL-常用算法概述:算法主要是由头文件<algorithm><functional><numeric>组成。<algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数<functional>定义了一些模板类......
  • 一个看似简单的查找算法 —— 二分查找算法
    前言二分查找算法应该是非常常见的一个算法了,查找速度快,算法逻辑简单是大家对该算法的一个大致印象。相信有很多同学能够在很短的时间内写出一个二分查找算法,即便记不太清二分查找算法的逻辑,稍微搜一下,瞟一眼,就能迅速回忆起该算法的大致逻辑,然后迅速写出来该算法。但是,实际上二......
  • Python3.12新增内容
    https://medium.com/techtofreedom/5-handy-python-3-12-new-features-that-improve-your-coding-experience-fe2d6e1f05b4类型系统,更方便的类型别名声明方式简便的类型别名声明我们可以直接如下定义类型别名Point=tuple[float,float]classPointTest: def__init__(s......
  • Python教程(16)——lambda表达式详解
    lambda函数介绍我们平时经常可以在Python的代码中看到一种lambda开头的这种表达式,如果没有学过Python的相关知识,可能会一脸懵逼,不清楚到底这个关键字是干嘛的,用来表示什么。实际上这个就是lambda函数。lambda函数是Python中一种特殊的匿名函数,但不仅仅只存在Python中,它允许我们......