递归到Iteratative - AVL树 - isBalanced

时间:2014-04-12 22:45:30

标签: python algorithm recursion avl-tree iteration

我必须编写一个迭代算法来确定AVL-Tree是否平衡。

我的第一个方法是找到一种直接的方式,但是在几个小时后我放弃了,所以我写了算法递归并尝试转换它。

这里是递归版本的源代码(用python编写)

def isBalanced(root):
    if root == None:
        return -1

    lh = isBalanced(root.left)
    rh = isBalanced(root.right)

    if lh == -2 or rh == -2:
        return -2

    if abs(lh - rh) > 1:
        return -2

    return max(lh, rh) + 1

我现在的问题是,我无法转换它,也许你们其中一个人可以给我一个提示或解决我的问题

提前致谢

1 个答案:

答案 0 :(得分:4)

请记住,递归程序使用调用堆栈。您可以使用堆栈将任何递归程序转换为迭代程序。在下面的代码中,我使用了两个。

def isBalanced(root):
    nodes = [root]
    results = []
    while nodes:
        node = nodes.pop()
        if node is None:
            results.append(-1)
        else if node == 0: # 0 is a flag we use for when we are ready to combine results
            lh = results.pop()
            rh = results.pop()
            if abs(lh - rh) > 1:
                return -2  # we could have continued with the stack; this is just a shortcut
            else:
                results.append(max(lh, rh) + 1)
        else:
            nodes.push(0)
            nodes.push(node.left)
            nodes.push(node.right)
    return results, # results will have only one value

这里,stack是要检查的节点堆栈,以及这些节点的结果。