AVL树 - 插入带索引的元素并存储两棵树|数据结构

时间:2016-10-15 16:44:36

标签: data-structures tree binary-search-tree computer-science avl-tree

我需要帮助才能理解以下数据结构问题的解决方案:

问题:

建议包含支持以下操作的整数的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)如何运作?我试图用照片中的例子来运行它并且没有收到正确的索引。

感谢您的帮助。

0 个答案:

没有答案