【发布时间】: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 而不会继续循环