C++ 使用空树(C+;+;模板)合并AVL树

C++ 使用空树(C+;+;模板)合并AVL树,c++,data-structures,merge,binary-tree,avl-tree,C++,Data Structures,Merge,Binary Tree,Avl Tree,作为我正在处理的AVL模板(C++模板)的一部分,我尝试在O(n1+n2)复杂度下合并两个AVL树,而n1+n2是两个树中的全部元素 我考虑了下一个算法 按顺序遍历第一棵树并构建一个数组/列表-O(n1) 按顺序遍历第二棵树并构建一个数组/列表-O(n2) 合并这两个数组的排序,并构建大小为n1+n2-O(n1+n2)的最终排序数组/列表 用n1+n2顶点-O(n1+n2)构建一个空的几乎完整的二叉树 在使用合并数组/列表中的元素更新顶点时,按顺序遍历几乎完整的二叉树 我的问题是如何实际构建具有

作为我正在处理的AVL模板(C++模板)的一部分,我尝试在O(n1+n2)复杂度下合并两个AVL树,而n1+n2是两个树中的全部元素

我考虑了下一个算法

  • 按顺序遍历第一棵树并构建一个数组/列表-O(n1)
  • 按顺序遍历第二棵树并构建一个数组/列表-O(n2)
  • 合并这两个数组的排序,并构建大小为n1+n2-O(n1+n2)的最终排序数组/列表
  • 用n1+n2顶点-O(n1+n2)构建一个空的几乎完整的二叉树
  • 在使用合并数组/列表中的元素更新顶点时,按顺序遍历几乎完整的二叉树

  • 我的问题是如何实际构建具有n1+n2个顶点的空几乎完全二叉树?

    如果合并排序发出的节点存储在向量中,则可以相对轻松地完成。您的节点已排序,因此可以按以下方式“插入”节点:

  • 从数组1/2处的元素构建根节点
  • 使用数组1/4和3/4处的元素构建根的子节点
  • 递归地重复2
  • 对您来说,这应该是一个二叉树的有序遍历,而二叉树恰好表示为一个排序数组


    请注意,要使其工作,您需要在平衡“关闭”的情况下构建树。这很可能需要您将其作为类的私有方法,可能是一个特殊的构造函数。

    顺便说一句,这更像是步骤4和步骤5的组合。我不建议您构建“带有
    n1+n2
    节点的空二叉树”。好主意,谢谢。我想它被认为比仅仅用X元素构建一个几乎完整的树更简单?此外,树中的每个顶点都包含一个字段,该字段表示左子树中有多少元素。如果以这种方式构建树,那么在树已经完成之后,我必须更新顺序遍历中的所有字段?分割数组时,即使尚未插入子节点,也知道要在任意一侧插入多少节点。将其设置为该值,或者实际执行递归插入并在返回的过程中对子节点求和注意,如果树支持中的迭代器,则实际上可以直接执行步骤3,而无需在中间存储中复制两棵树的节点。