问题描述
假设我有两个 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
lefttree (rotating and adjusting its computed height if necessary). Letnbe 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. Letrbe that node. O(log n) replace that node with a new node with value n, and subtrees
leftandr. 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 树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)