我正在练习一些面试题,尝试确定给定二叉树是否平衡的时间复杂度。
我认为解决方案2的时间复杂度为O(n)
,而解决方案1的时间复杂度为O(n^2)
。这是由于在解决方案1中,您需要递归到树的底部来检查树是否平衡,并检查子树高度的差异。随着我们向根部回溯,额外的复杂性会增加,因为get_height仍然会递归下去计算高度,所以再次遍历树--> O(n^2)
。
解决方案2比较高度的事实意味着随着我们向树的上方移动,我们不必返回检查子树高度。
助手:
def get_height(root):
if root is None:
return 0
else:
return max(get_height(root.left), get_height(root.right)) + 1
解决方案1:
def is_balanced(root):
if root is None:
return True
else:
return is_balanced(root.right) and is_balanced(root.left) and (abs(get_height(root.left) - get_height(root.right)) < 2)
解决方案2:
def is_balanced2(root):
if root is None:
return True
else:
return (abs(get_height(root.left) - get_height(root.right)) < 2) and is_balanced(root.right) and is_balanced(root.left)
检查时间差异的代码:
s = time.time()
print("result: {}".format(is_balanced(a)))
print("time: {}".format(time.time() - s))
s = time.time()
print("result: {}".format(is_balanced2(a)))
print("time: {}".format(time.time() - s))
未平衡二叉树的结果:
result: False
time: 2.90870666504e-05 # solution 1
result: False
time: 1.50203704834e-05 # solution 2
abs(get_height(root.left) - get_height(root.right)) < 2)
条件。正如Wikipedia所说,高度差<2在平衡二叉树中很常见-甚至由一些插入算法保证-但不是定义的一部分。 - Tony Delroy