【问题标题】:An efficient pseudo-code that check if a given BST is a valid AVL tree检查给定 BST 是否为有效 AVL 树的有效伪代码
【发布时间】:2018-04-29 01:00:20
【问题描述】:

我需要编写一个算法(用伪代码)来检查给定的 BST 树是否是有效的 AVL 树。为此,我需要给每个节点一个等级(在 AVL 树中,等级是指节点的高度),因此结果将是一个有效的 AVL 树。

我想到了一个简单的算法,它在每一步中计算一个节点的高度和它的两个儿子的高度(如果儿子为空,那么高度为-1),然后检查高度之间的差异是否为1,1 或 1,2 或 2,1。如果不是,那么它不是 AVL 树。如果是,那么我们对 node.left 和 node.right 做同样的事情。

我对该算法的问题是时间复杂度非常大,甚至可能达到 O(n^2)。有没有更高效的算法?

我想找到的另一种算法是,当给定一个有效的 AVL 树和每个节点的等级 (rank=height) 时,我需要找到一系列构建同一棵树的插入。我想过按键的排序顺序来做,但结果不对。

【问题讨论】:

    标签: algorithm insert binary-search-tree pseudocode avl-tree


    【解决方案1】:

    AVL-树检查

    其实你的想法是对的。但是你错过了使用树高的递归定义

    height(node) =  1 + max(height(node.left), height(node.right))
    

    这就是为什么你有一个巨大的复杂性(尽管O(2^n) 太悲观了)。与其直接以自顶向下方法计算节点的高度,不如采用另一种方法,从自底向上计算各个节点的高度:

    valid_avl(node):
        if node is null then
            return -1, True
    
        left_height, left_valid = valid_avl(node.left)
        right_height, right_valid = valid_avl(node.right)
    
        if not left_valid or not right_valid or abs(left_height - right_height) > 1 then
            return -1, False
        else
            return 1 + max(left_height, right_height), True
    

    您可能希望将 this 函数拆分为两个函数并避免使用元组,具体取决于您使用的语言。请注意,尽管上面看起来类似于 python 只是伪代码!!!

    重建树

    这些其实相当简单。获取level-order 中树中的所有值,并按此顺序准确插入它们。这样一来,树永远不会重新平衡,并且每个节点都会自动放置在正确的位置。

    【讨论】:

    • 谢谢!我使用重复确实是我错过了。
    • 我只是好奇是否有更有效的方法来重建树。因为每次我们添加一个节点时,我们可能需要提升它所有祖先的排名。这样所有系列的时间复杂度都是 O(nlogn)。有没有办法在 O(n) 中做到这一点?
    • @GabiG 不,没有。在 AVL-Tree 中,单个元素的插入平均为 O(log n)。将构建过程保持在O(n) 的唯一可能方法是通过直接设置 rank 等值来生成树的深度克隆。如果你想使用标准的insert-方法,O(n log n) 是你能得到的最好的。
    • 我明白了!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2011-01-04
    相关资源
    最近更新 更多