有效地在二叉树中标记高度

时间:2017-09-15 22:00:34

标签: algorithm

我试图找出如何用高度标记二叉树中的每个节点。我的效率低下如下:

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)。

我想我想工作"自下而上":计算节点子节点的高度(如果尚未存储)并使用它来设置相关节点的高度。

我有点难过。

仅供参考,这不是硬件问题。

谢谢!

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)