【问题标题】:Diameter of the tree树的直径
【发布时间】:2021-06-19 14:37:36
【问题描述】:

我有一个代码可以找到树的直径。 根据我的理解,直径是 2 个叶节点之间最长路径中的节点数。

代码是:

def diameter(root):
    if root is None:
        return 0
    lheight = height(root.left)
    rheight = height(root.right)

    ldiameter = diameter(root.left)
    rdiameter = diameter(root.right)
 
    return max(lheight + rheight + 1, max(ldiameter, rdiameter))

其中height是一个计算节点高度的函数。 但是,我觉得没有必要对diameter 函数进行递归调用,如下面的 sn-p 所示,因为它给出了相同的输出。

def diameter(root):
    if root is None:
        return 0
    lheight = height(root.left)
    rheight = height(root.right)

    return lheight + rheight + 1

为什么在第一个代码中需要递归调用diameter

可能我找不到lheight + rheight + 1小于max(ldiameter, rdiameter)的情况。

def height(node):
    if node is None:
        return 0
    return 1 + max(height(node.left), height(node.right))

【问题讨论】:

  • 我想知道这两行需要什么:ldiameter = diameter(root.left) rdiameter = diameter(root.right)
  • height 是如何定义的?
  • 添加了高度定义。

标签: python tree recursive-datastructures


【解决方案1】:

需要递归调用 diameter 函数,因为树的直径不一定要经过树的根。

您的第二段代码只给出了结果height(left subtree of root) + height(right subtree of root) + 1,如果直径“路径”通过根(但并非总是如此),这将是正确的答案。

这种树的一个例​​子是第二棵树 -

在上面的第二张图片中,如果我们应用您的第二个代码,我们将得到结果为 7 但正确答案是 9(如果我们认为直径不通过根)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多