是否存在用子树大小注释的二叉搜索树的实现

问题描述

|| 我一直在研究此链接(在底部附近)中描述的树数据结构: http://sigpipe.macromates.com/2009/08/13/maintaining-a-layout/ 提到该数据结构可以是手指树。但是,在对手指树进行更多研究之后,我发现它缺少使手指树成为手指树的“手指”。相反,似乎这只是一个带注释的二叉树(带有子树大小的注释)。 您是否知道该数据结构的现有实现(任何语言),可以用作自己实现的参考(尽管最好不是功能性编程语言中的实现)? 或者,将子树大小注释改型为现有树数据结构的最佳方法是什么? 谢谢!     

解决方法

西蒙·塔瑟姆(Simon Tatham)的计数B树类似。如果像调整一样将节点数替换为缓冲区的宽度,则这些节点将提供类似于绳索的操作。 实际上,通过阅读您所引用的页面,我看到它被用作编辑器的样板表或折线表 在论文“位置增量树”中,通过使用读取优化的数据存储来协调更新,作者提出了一种树,该树的行为与树中各节点之间的不变量有关,与xanadu的信息网络非常相似。计数的B树也相似。     ,我在github上有一个名为Boost.Intrusive Annotated Trees的项目,该项目旨在为Boost.Intrusive中的子树计数之类的注释提供通用支持。子树计数是我最初的用例。 当前,它需要C ++ 11可变参数模板,并且仅支持rbtree,但是它可以正常工作,我希望及时消除这两个限制。 更新:现在使用C ++ 03构建。仍然仅支持rbtree。 当与子树计数注释一起使用时,它类似于jordan在上面的答案中描述的内容-它在每个节点处计算(left + right + 1)。实现是完全不同的-它适用于任何节点和/或值特征;注释更新被集成到rbtree算法中,从而使重新计算的次数保持最少。     ,我根据前几天提出的问题实施了类似的操作。我在boost :: intrusive :: rbtree / avltree节点上添加了注释,以计算每个子树的大小(foreach节点数= node-> left-> count + node-> right-> count + 1)。我通过使用set_parent,set_left和set_right的boost value_traits挂钩对树的插入/删除/重新平衡执行此更新。如您所引用的站点中所述,几乎每个节点更新之后,都会更新当前节点的大小,然后遍历树直到您击中根节点,然后再更新每个节点的大小。 当您要插入树的特定位置时,就会出现问题。在执行此操作的几乎一瞬间,您将使树结构的键顺序不变式无效。这意味着您将无法通过键执行有效的O(log n)查找。但是,如果您愿意,无论如何都可能不需要尺寸注释。