Python 计数树中的叶数-失败边缘情况?

Python 计数树中的叶数-失败边缘情况?,python,tree,Python,Tree,在一次在线评估中,我被要求数一数树上叶子的数量。该树以父数组表示形式给出,这意味着该树有n个节点,标签为0、1、2、…、n-1,并向您传递一个长度为n的数组p,其中p[i]返回节点i的父节点的标签,除非i是树的根,在这种情况下p[i]为-1 我想需要注意的一点是,问题如上所述,因此没有额外的条件,例如,它是一棵二叉树 我认为这是一个相当直截了当的问题,但我提交的代码在测试平台上的“小树案例”失败(它不允许您查看测试案例)。它通过了其他测试,包括对一棵大树的性能测试。我已经考虑了一段时间,但我仍然

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

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

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

def countLeaves(p):
n=len(p)
如果p为None或n==0:返回0
如果n==1或n==2:返回1
叶=设置(范围(n))
对于范围(n)中的i:
如果p[i]=-1:#i是节点大于1的树的根,则不能是叶
树叶。丢弃(i)
else:#p[i]是节点i的父节点,不能是叶子
叶子。丢弃(p[i])
返回len(叶)
在尝试修复失败的“小树案例”时,我还尝试了在p为None时返回None,在n==0时返回None,或者两个修改一起返回None,但都没有成功。如果有人能指出我代码中的错误,我将不胜感激。谢谢。

我想试试这个:

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)
def countLeaves(p):
n=len(p)
如果p为None或n<2:返回0
叶=设置(范围(n))
对于范围(n)中的i:
如果p[i]=-1:#i是节点大于1的树的根,则不能是叶
树叶。丢弃(i)
else:#p[i]是节点i的父节点,不能是叶子
叶子。丢弃(p[i])
返回len(叶)
唯一真正的变化是它认为只有一个节点的树没有叶子

根据:

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


一个节点可以有多个子节点吗?我看没问题。如果它认为只有一个元素(根)的树有0片叶子怎么办?你的代码对我来说很好,你用的“小树案例”是什么?@NullUserException我认为在这种情况下,它返回1而不继续循环谢谢你。我猜这一定是我弄错的边缘案例。