• Python算法——树的直径


    Python中的树的直径算法详解

    树的直径是树中任意两个节点之间最长路径的长度。在本文中,我们将深入讨论树的直径问题以及如何通过深度优先搜索(DFS)算法来解决。我们将提供Python代码实现,并详细说明算法的原理和步骤。

    树的直径

    树的直径定义为树中任意两个节点之间最长路径的长度。这个路径不一定经过根节点。直径的计算通常是通过计算树中每个节点为起点的最长路径,然后取其中的最大值。

    深度优先搜索算法求解树的直径

    深度优先搜索(DFS)是一种递归的算法,通过深度遍历树的节点。在求解树的直径时,我们可以从树的任一节点开始,进行深度优先搜索,计算经过当前节点的最长路径,同时更新直径的最大值。我们需要计算两个值:

    1. 从当前节点出发的最长路径(左子树深度 + 右子树深度)。
    2. 经过当前节点的最长路径。
    class TreeNode:
        def __init__(self, value):
            self.val = value
            self.left = None
            self.right = None
    
    class Solution:
        def diameter_of_binary_tree(self, root):
            self.diameter = 0  # 用于记录直径的最大值
    
            def depth(node):
                if not node:
                    return 0
    
                left_depth = depth(node.left)
                right_depth = depth(node.right)
    
                # 更新直径的最大值
                self.diameter = max(self.diameter, left_depth + right_depth)
    
                # 返回当前节点的深度
                return 1 + max(left_depth, right_depth)
    
            depth(root)
            return self.diameter
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    示例
    # 构建一个二叉树
    """
           1
          / \
         2   3
        / \
       4   5
    """
    root = TreeNode(1)
    root.left = TreeNode(2)
    root.right = TreeNode(3)
    root.left.left = TreeNode(4)
    root.left.right = TreeNode(5)
    
    sol = Solution()
    diameter = sol.diameter_of_binary_tree(root)
    print("树的直径:", diameter)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    输出结果:

    树的直径: 3
    
    • 1

    这表示树的直径为3,最长路径为节点4到节点5或节点2到节点1到节点3。通过深度优先搜索算法,我们能够有效地求解树的直径问题。这种算法的时间复杂度为O(N),其中N为树中的节点数。通过理解算法的原理和实现,您将能够更好地解决类似的树结构问题。

  • 相关阅读:
    【ROS】ros-noetic和anaconda联合使用【教程】
    使用最新android sdk 将jar文件编译成dex
    数据结构:选择题+编程题(每日一练)
    idea显示pom.xml文件漂黄警告 Dependency maven:xxx:xxx is vulnerable
    LLM 面试总结
    l8-d8 TCP并发实现
    【python】自动化工具Selenium与playwright去除webdriver检测
    1. STL六大组件
    从list转化成map的时候,如果根据某一属性可能会导致key重复而异常,可以设置处理这种重复的方式
    Linux命令
  • 原文地址:https://blog.csdn.net/weixin_46178278/article/details/134433410