Algorithm 在二叉树上迭代,不控制堆栈或动态分配

Algorithm 在二叉树上迭代,不控制堆栈或动态分配,algorithm,data-structures,iterator,range,binary-tree,Algorithm,Data Structures,Iterator,Range,Binary Tree,在以下约束条件下,是否有一种有效、实用的方法来迭代二叉树: 您无法控制调用堆栈,因此可能无法使用递归。所有状态必须位于迭代器/范围对象内部,而不是堆栈上 算法中的任何位置都不能使用堆分配 树可能是不可变的,因此不能在其中存储迭代状态 您没有父指针 迭代器/范围结构不能太大,以至于传递给函数是完全不合理的 编辑: 这不是家庭作业。实际上,我正在尝试设计一个库,它在第二个堆栈上构建二叉树,并对堆分配(或缺少堆分配)做出很多保证 树木是平衡的。(它们是AVL树。) 它只能对深度达到一定限制(因此在元素

在以下约束条件下,是否有一种有效、实用的方法来迭代二叉树:

  • 您无法控制调用堆栈,因此可能无法使用递归。所有状态必须位于迭代器/范围对象内部,而不是堆栈上
  • 算法中的任何位置都不能使用堆分配
  • 树可能是不可变的,因此不能在其中存储迭代状态
  • 您没有父指针
  • 迭代器/范围结构不能太大,以至于传递给函数是完全不合理的
  • 编辑:

  • 这不是家庭作业。实际上,我正在尝试设计一个库,它在第二个堆栈上构建二叉树,并对堆分配(或缺少堆分配)做出很多保证
  • 树木是平衡的。(它们是AVL树。)

  • 它只能对深度达到一定限制(因此在元素数量上)的树进行,因为它需要与树深度成比例的辅助内存;在迭代某个项目时,您需要跟踪下一个项目,如果您处于最深的叶子之一,那么所需的“跟踪指针”数量将仅比树的深度少1。例如,如果可以接受深度限制为32(因此不超过4294967295个节点),则需要一个32个指针的辅助固定大小数组(加上索引)


    对于不完全退化的二叉树(因此节点数量大致与
    2**depth
    ,而不仅仅与
    depth
    ;-)成比例),这种固定数量的辅助内存应该是可以接受的——即,仅以
    log(N)的顺序固定辅助内存
    指向在最多有
    N个节点的任意树上迭代的指针。如果这是不可接受的,那么您的问题“是否存在…?”的答案是否定的;-)

    它只能对深度达到一定限制(因此在元素数量上)的树进行,因为它需要与树深度成比例的辅助内存;在迭代某个项目时,您需要跟踪下一个项目,如果您处于最深的叶子之一,那么所需的“跟踪指针”数量将仅比树的深度少1。例如,如果可以接受深度限制为32(因此不超过4294967295个节点),则需要一个32个指针的辅助固定大小数组(加上索引)


    对于不完全退化的二叉树(因此节点数量大致与
    2**depth
    ,而不仅仅与
    depth
    ;-)成比例),这种固定数量的辅助内存应该是可以接受的——即,仅以
    log(N)的顺序固定辅助内存
    指向在最多有
    N个节点的任意树上迭代的指针。如果这是不可接受的,那么您的问题“是否存在…?”的答案是否定的;-)

    如果您的树保证按其值排序,并且这些值严格按升序排列(全部B>A,而不仅仅是B>=A),那么您可以不使用动态内存遍历大小不限的树。不过,你确实受到了表演上的打击

    要查找值A之后的下一个值,只需再次下降到树中,对略大于A的值进行二进制(当然)搜索


    我只是想出来的。如果有人能证明我的想法是错误的,那就说吧

    如果您的树保证按其值排序,并且这些值严格按升序排列(全部B>A,而不仅仅是B>=A),那么您可以不使用动态内存遍历大小不限的树。不过,你确实受到了表演上的打击

    要查找值A之后的下一个值,只需再次下降到树中,对略大于A的值进行二进制(当然)搜索


    我只是想出来的。如果有人能证明我的想法是错误的,那就说吧

    这是一个挑战,或者仅仅是家庭作业?这是一个挑战,或者仅仅是家庭作业?好主意,这意味着您可以在O(N log N)中迭代树。如果你将其与固定大小的堆栈相结合,这样你只需要很少进行搜索,那么对于任何实际的树大小,该算法的性能都将与O(N)算法更相似。好主意,这意味着你可以在O(N log N)中迭代树。如果您将其与固定大小的堆栈相结合,这样您只需要非常不频繁地执行此搜索,那么对于任何实际的树大小,该算法的执行方式将更类似于O(N)算法。