我正在从网站上解决以下问题:"编写一个函数来查看二叉树是否超级平衡" (我们刚刚制作的新树属性)。 一棵树是超平衡的"如果任何两个叶节点的深度之间的差异不大于1。"
网站检查两个节点之间深度差异的方法是进行深度优先搜索,然后将每个访问节点的深度附加到名为depths的列表中,只要深度不在列表中:< / p>
if depth not in depths:
depths.append(depth)
# two ways we might now have an unbalanced tree:
# 1) more than 2 different leaf depths
# 2) 2 leaf depths that are more than 1 apart
if (len(depths) > 2) or \
(len(depths) == 2 and abs(depths[0] - depths[1]) > 1):
return False
我不明白的是,为什么我们要检查两种方式?仅仅检查条件是否有超过2个不同的叶子深度或2个不同的叶子深度是否超过一个是不够的?为什么两次检查都有用?
来源:InterviewCake.com
引用的代码/问题答案 0 :(得分:1)
你需要同时检查两种......
第一个显然是不够的,因为你可以len(depths)==2
以及两个>1
之间的差异。
第二个条件,正如它所写的那样,只有在len(depth)
正好2
时才有效。
你可能只有后一个条件,但是你需要迭代depth
列表中的所有项目。
所以基本上它的设计方式尽可能高效。您可能会认为这是过度优化的情况,因为depths
列表的长度永远不会大于3
,这也是此检查将执行的最大数量。
我会使用像max(depths) - min(depths) > 1
这样的东西,它更具可读性和直观性,对性能的影响可以忽略不计。