我需要帮助才能理解以下数据结构问题的解决方案:
问题:
建议包含支持以下操作的整数的ADT。解释一下这些 行动已实施。
Init() - 初始化ADT O(1)
插入(x) - 将x插入ADT,如果它不在ADT中,则为O(log n)
删除(x) - 从ADT删除x,如果存在O(log n)
Delete_in_place(i) - 从ADT中删除第i个元素
其中(由插入顺序决定)
那一刻ADT中的元素。
O(log n)
Get_place(x) - 返回地点(由顺序决定)
在ADT中的元素中插入x
那一刻。如果x不存在,则返回-1。
O(log n)
例如,对于以下操作序列: 插入(3),插入(5),插入(11),插入(4),插入(7),删除(5) Get_place(7)返回4,Delete_in_place(2)将从树中删除11
解决方案:
ADT由2棵AVL树组成 - T1按键存储元素 - T2按插入顺序存储元素(使用运行计数器)。到这棵树 new元素将作为此树中所有元素的最大元素插入。节点 这个树存储也是它们子树中元素的数量 - x.size。每个节点都有一个 指向他父亲的指针。 - 在连接节点的所有树之间都有指针与相同的密钥。
Here is an example of the two trees
Init() - 初始化2个空树
插入(x) - 按键将元素插入T1,将元素作为最大值插入T2,
更新指针。在T2中更新插入路径中的字段x.size。 (插入是
在AVL树中)
删除(x) - 在T1中找到元素(常规搜索),并从树中删除它。在T2去
从已删除的元素到根目录,并为此路径中的所有节点更新x.size。 (该
删除与AVL树中一样)
Delete_by_place(i) -
Delete_by_place(i) – find the ith element in T2 in the following way:
x←T2.root
if x.size<i return
while(x!=null)
if x.left = null
z←0
else
z←x.left.size
if (i ≤ z)
x←x.left
else if (i = z + 1)
Delete(x) and break
else // i > z+1
i ← i – (z + 1)
x←x.right
Get_place(x) - 在T1中查找x,通过其指向T2的指针,然后计算树中x的索引 - 从x上升到根。在此路径中,总计左子树中的节点数 路径中的节点小于x:
place←1
place←place+x.left.size
while (x.parent != null)
{
if (x is left_child of x.parent)
x←x.parent
else //x is right child
place←place+1+x.parent.left.size
x←x.parent
}
return place
我的问题 -
如何插入T2树?在附图中有一个这个树的例子,我不明白它是如何构建的?
由于写的是这是一个AVL树,我们是否进行旋转?我们如何保持平衡?它不是BST ......
Delete_in_place(i)如何运作?我试图用照片中的例子来运行它并且没有收到正确的索引。
感谢您的帮助。