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

Data structures AVL树-插入带索引的元素并存储两棵树|数据结构,data-structures,tree,binary-search-tree,computer-science,avl-tree,Data Structures,Tree,Binary Search Tree,Computer Science,Avl Tree,我需要帮助了解以下数据结构问题的解决方案: 问题: 建议包含支持以下操作的整数的ADT。解释这些 采取行动 初始化()-初始化ADT O(1) 插入(x)-如果ADT尚未处于ADT中,则将x插入ADT O(日志n) 删除(x)-如果存在,则从ADT中删除x(日志n) Delete_in_place(i)-从ADT中删除第i个元素 将(由插入顺序决定)放置在 此时ADT中的元素。 O(对数n) 获取位置(x)-返回位置(由 在ADT中的元素中插入x) 那一刻。如果x不存在,则返回-1。 O(对数n

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

问题:

建议包含支持以下操作的整数的ADT。解释这些 采取行动

初始化()-初始化ADT O(1)
插入(x)-如果ADT尚未处于ADT中,则将x插入ADT O(日志n)
删除(x)-如果存在,则从ADT中删除x(日志n)
Delete_in_place(i)-从ADT中删除第i个元素 将(由插入顺序决定)放置在 此时ADT中的元素。 O(对数n)
获取位置(x)-返回位置(由 在ADT中的元素中插入x) 那一刻。如果x不存在,则返回-1。 O(对数n)

例如,对于以下操作序列: 插入(3)、插入(5)、插入(11)、插入(4)、插入(7)、删除(5) Get_place(7)返回4,而Delete_in_place(2)将从树中删除11

解决方案:

ADT由2个AVL树组成。
-T1通过其键存储元素。
-T2按插入顺序存储元素(使用运行计数器)。到这棵树上去 新元素将作为此树中所有元素中最大的元素插入。节点 此树的值还存储其子树中的元素数–x.size。每个节点都有一个 指向他父亲的指针。 -所有树之间都有指针,这些树用相同的键连接节点

Init()–初始化2个空树
插入(x)–按键将一个元素插入T1,将该元素作为T2的最大元素插入,然后 更新指针。在插入路径中的字段x.size中更新T2。(插入内容如下所示。) 在AVL树中)
删除(x)–在T1(常规搜索)中查找元素,并将其从两个树中删除。在t2go中 从已删除的元素向上移动到根,并更新此路径中所有节点的x.size。(修订) 删除如AVL树中所示)

按位置删除(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
我的问题-
如何插入到T2树?在附上的照片中有一个例子,这棵树,我不明白它是如何建立的

因为这是一棵AVL树,我们要进行旋转吗?我们如何保持平衡?它不起BST的作用

“删除位置”(i)是如何工作的?我尝试使用照片中的示例运行它,但没有收到正确的索引


感谢您的帮助。

是否需要使用两棵AVL树,或者可以使用一个数组进行索引?只要时间复杂度为O(logn),您就可以使用您喜欢的方法。是否需要使用两棵AVL树,或者可以使用一个数组进行索引?只要时间复杂度为O(logn),您就可以使用您喜欢的方法
 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