串联/合并/联接两个AVL树
假设我有两棵AVL树,并且第一棵树中的每个元素小于第二棵树中的任何元素。将它们串联到单个AVL树中的最有效方法是什么?我到处搜索过,但没有发现任何有用的信息。
回答:
假设您可能会破坏输入树:
- 删除左侧树的最右边的元素,并使用它来构造一个新的根节点,该节点的左子节点是左树,右子节点是右树:O(log n)
- 确定并设置该节点的平衡因子:O(log n)。在(临时)违反不变量的情况下,平衡因子可能不在{-1,0,1}范围内
- 旋转以使平衡因子回到范围内:O(log n)旋转:O(log n)
因此,整个操作可以在O(log n)中执行。
编辑:经过深思熟虑,在以下算法中更容易推断出旋转。它也很有可能更快:
确定两棵树的高度:O(log n)。
假设右树较高(另一种情况是对称的):
从
left
树中删除最右边的元素(如有必要,旋转并调整其计算的高度)。让n
那个元素。O(log n)- 在右侧树中,向左导航,直到到达其子树比最多高1的节点
left
。让它r
成为那个节点。O(log n) 用值为n的新节点,子树
left
和替换该节点r
。O(1)通过构造,新节点是AVL平衡的,并且其子树比更高
r
。相应地增加其父母的余额。O(1)
并像插入后一样重新平衡。O(log n)
以上是 串联/合并/联接两个AVL树 的全部内容, 来源链接: utcz.com/qa/414369.html