假设我有两棵AVL树,并且第一棵树中的每个元素小于第二棵树中的任何元素。将它们串联到单个AVL树中的最有效方法是什么?我到处搜索过,但没有发现任何有用的信息。
假设您可能会破坏输入树:
因此,整个操作可以在O(log n)中执行。
编辑:经过深思熟虑,在以下算法中更容易推断出旋转。它也很有可能更快:
确定两棵树的高度:O(log n)。 假设右树较高(另一种情况是对称的):
从left树中删除最右边的元素(如有必要,旋转并调整其计算的高度)。让n那个元素。O(log n)
left
n
r
用值为n的新节点,子树left和替换该节点r。O(1) 通过构造,新节点是AVL平衡的,并且其子树比更高r。
相应地增加其父母的余额。O(1)
并像插入后一样重新平衡。O(log n)