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