我正在研究Leetcode上的以下算法问题:
给定二叉树,确定它是否是高度平衡的。为了这 问题,高度平衡的二叉树被定义为二进制树 其中每个节点的两个子树的深度从不相差更多 比1。
以下是链接:https://leetcode.com/problems/balanced-binary-tree/
我写了两个解决方案 - 两个都通过了Leetcode的测试。第一个应该比第二个更昂贵,因为它反复扫描每个子树的节点以计算每个节点的高度。第二个解决方案应该将所有节点高度收集到缓存中,以便不必重复计算。然而,事实证明我的第二个解决方案实际上比我的第一个解决方案慢,我不知道为什么。有什么输入吗?
解决方案1:
def is_balanced(root) #runs at 139 ms
return true if root.nil?
left_height = height(root.left)
right_height = height(root.right)
if !equal?(left_height, right_height)
return false
else
is_balanced(root.left) && is_balanced(root.right)
end
end
def height(node)
return 0 if node.nil?
[height(node.left), height(node.right)].max + 1
end
def equal?(num1, num2)
return true if (num1-num2).abs <= 1
false
end
解决方案2 :(编辑以包括cobaltsoda的建议)
@memo = {}
def is_balanced(root)
@memo = {}
return true if root.nil?
left_height = height(root.left)
right_height = height(root.right)
if !equal?(left_height, right_height)
return false
else
is_balanced(root.left) && is_balanced(root.right)
end
end
def height(node)
@memo[node] = 0 if node.nil?
@memo[node] ||= [height(node.left), height(node.right)].max + 1
end
def equal?(num1, num2)
return true if (num1-num2).abs <= 1
false
end
因为第二个解决方案使用了memoization,它不应该削减冗余并降低程序的时间开销吗?不确定我错过了什么。
另外,通过memoization,这从O(NlogN)算法到O(N)正确吗?