我试图找出如何用高度标记二叉树中的每个节点。我的效率低下如下:
def getHeight(node)
if node is None:
return 0
return 1 + max(node.left, node.right)
def labelHeights(root):
if root is None:
return
root.height = getHeight(root)
labelHeights(root.left)
labelHeights(root.right)
然而,这浪费了很多时间并且二叉树中的节点数是O(n ^ 2)。
我想我想工作"自下而上":计算节点子节点的高度(如果尚未存储)并使用它来设置相关节点的高度。
我有点难过。
仅供参考,这不是硬件问题。
谢谢!
答案 0 :(得分:1)
您不需要getHeight
。只需让labelHeights
返回每个子树的高度,就可以在O(N)中执行深度优先。 e.g。
def labelHeights(n):
if n is None:
return 0
lh = labelHeights(n.left)
rh = labelHeights(n.right)
n.height = max(lh, rh) + 1
return n.height
答案 1 :(得分:0)
Python不是我的主要语言,所以不要对代码风格做出判断。
鉴于此课程:
class Node:
def __init__(self, key):
self.data = key
self.left = None
self.right = None
self.label = 0
您可以使用level order traversal
制作queue
。
def levelOrder(root):
levelLabel = 0
if root is None:
return
queue = []
queue.append(root)
tempQueue = []
while (len(queue) > 0 or len(tempQueue) > 0):
node = queue.pop(0)
node.label = levelLabel
print node.data , " " , node.label
if node.left is not None:
tempQueue.append(node.left)
if node.right is not None:
tempQueue.append(node.right)
if(len(queue) == 0):
levelLabel += 1
queue = tempQueue
tempQueue = []
在tempQueue
中将存储特定级别的所有节点。
如果len(queue) == 0
为真,则表示遍历了一个级别,因此我们递增levelLabel
变量。
使用示例:
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.left.right.right = Node(6)
root.left.right.left = Node(7)
root.left.right.right.left = Node(8)
结果:
1 - level 0
2 - level 1
3 - level 1
4 - level 2
5 - level 2
7 - level 3
6 - level 3
8 - level 4
此算法的复杂性为O(n)
。