【问题标题】:Count number of leaves in a tree - Failed edge case?计算树中的叶子数 - 边缘情况失败?
【发布时间】:2019-09-30 06:28:37
【问题描述】:

在一次在线评估中,我被要求数一数一棵树的叶子数量。树以父数组表示形式给出,这意味着树有 n 个节点,标签为 0、1、2、..、n-1,并且传递给您一个长度为 n 的数组 p,其中 p[i] 返回节点 i 的父节点,除非 i 是树的根,在这种情况下 p[i] 为 -1。

我想需要注意的一件事是问题如上所述,因此没有额外的条件,例如它是一棵二叉树。

我认为这是一个相当直接的问题,但我提交的代码在测试平台上失败了一个“小树案例”(它不会让你看到测试用例)。它通过了其他测试,包括对一棵大树的性能测试。我已经考虑了一段时间,但我仍然看不出我的算法或处理某些极端情况的缺陷是什么。我想需要注意的一件事是问题如上所述,因此没有额外的条件,例如它是一棵二叉树。

def countLeaves(p):
    n = len(p)
    if p is None or n == 0 : return 0
    if n == 1 or n == 2 : return 1

    leaves = set(range(n))
    for i in range(n):
        if p[i] == -1: # i is root of tree with >1 node, can't be a leaf
            leaves.discard(i)
        else: # p[i] is parent of node i, can't be a leaf
            leaves.discard(p[i])

    return len(leaves)

在尝试修复失败的“小树案例”时,我还尝试在 p 为 None 时返回 None,如果 n == 0 则返回 None,或者同时进行两种修改,但没有成功。如果有人能指出我的代码中的错误可能是什么,我将不胜感激。谢谢。

【问题讨论】:

  • 你得到的错误是什么
  • 一个节点可以有多个子节点吗?
  • 对我来说看起来不错。如果它认为只有一个元素(根)的树有 0 个叶子怎么办?
  • 你的代码对我来说很好用,你试过的“小树案例”是什么?
  • @NullUserException 我认为在这种情况下它会返回 1 而不会继续循环

标签: python tree


【解决方案1】:

我会试试这个:

def countLeaves(p):
    n = len(p)
    if p is None or n < 2 : return 0

    leaves = set(range(n))
    for i in range(n):
        if p[i] == -1: # i is root of tree with >1 node, can't be a leaf
            leaves.discard(i)
        else: # p[i] is parent of node i, can't be a leaf
            leaves.discard(p[i])

    return len(leaves)

唯一真正的变化是它认为具有单个节点的树没有叶子。

根据Wolfram Mathworld

无根树的叶子是顶点度数为 1 的节点。请注意,对于有根或种植树,根顶点通常不被视为叶子节点,而所有其他度数的节点1个。

【讨论】:

  • 非常感谢。我猜这一定是我弄错了的边缘情况。
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多