Concatenating/Merging/Joining two AVL trees(连接/合并/加入两个 AVL 树)
问题描述
假设我有两个 AVL 树,并且第一棵树中的每个元素都小于第二棵树中的任何元素.将它们连接成一棵 AVL 树的最有效方法是什么?我到处搜索,但没有找到任何有用的东西.
Assume that I have two AVL trees and that each element from the first tree is smaller then any element from the second tree. What is the most efficient way to concatenate them into one single AVL tree? I've searched everywhere but haven't found anything useful.
推荐答案
假设您可能会破坏输入树:
Assuming you may destroy the input trees:
- 移除左树最右边的元素,并用它来构造一个新的根节点,其左孩子是左树,右孩子是右树:O(log n)
- 确定并设置该节点的平衡因子:O(log n).在(临时)违反不变量的情况下,平衡因子可能超出范围 {-1, 0, 1}
- 旋转使平衡因子回到范围内:O(log n) 旋转:O(log n)
因此,整个操作可以在 O(log n) 中执行.
Thus, the entire operation can be performed in O(log n).
再想一想,在以下算法中更容易推理旋转.它也很可能更快:
On second thought, it is easier to reason about the rotations in the following algorithm. It is also quite likely faster:
- 确定两棵树的高度:O(log n).
假设右边的树更高(另一种情况是对称的): - 从
left
树中移除最右边的元素(如有必要,旋转并调整其计算高度).让n
成为那个元素.O(log n) - 在右侧的树中,向左导航直到到达一个节点,该节点的子树最多比
left
高 1.让r
成为那个节点.O(log n) 用值为 n 的新节点以及子树
left
和r
替换该节点.O(1)
通过构造,新节点是 AVL 平衡的,其子树 1 比r
高.
- Determine the height of both trees: O(log n).
Assuming that the right tree is taller (the other case is symmetric): - remove the rightmost element from the
left
tree (rotating and adjusting its computed height if necessary). Letn
be that element. O(log n) - In the right tree, navigate left until you reach a node whose subtree is at most one 1 taller than
left
. Letr
be that node. O(log n) replace that node with a new node with value n, and subtrees
left
andr
. O(1)
By construction, the new node is AVL-balanced, and its subtree 1 taller thanr
.
相应地增加其父级的余额.O(1)
increment its parent's balance accordingly. O(1)
这篇关于连接/合并/加入两个 AVL 树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:连接/合并/加入两个 AVL 树


基础教程推荐
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 常量变量在标题中不起作用 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 这个宏可以转换成函数吗? 2022-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01