在此领域中,许多研究都是以“廉价”遍历树木和垃圾收集上下文中的一般列表结构的方法为主题的。
线程二叉树是二叉树的适应表示,其中一些零指针用于链接到树中的后继节点。这些额外的信息可用于遍历没有堆栈的树。但是,每个节点都需要一个额外的位来区分线程和子指针。维基百科:Tree_traversal
据我所知,可以使用线程方法遍历使用指针以通常方式实现的二叉树(每个节点左右指针),该方法属于Morris。NIL指针被临时重用以将路径穿入根目录。聪明的部分是,在遍历期间,可以使用临时线程链接在树中形成循环的方式来区分原始边缘。
好的部分:没有额外的数据结构。不良部分:略有作弊,堆栈以巧妙的方式位于树内。非常聪明。
P. Mateti和R. Manghirmalani中显示了隐藏堆栈的证明:重新考虑了Morris的树遍历算法DOI:10.1016 / 0167-6423(88)90063-9
JM Morris:简单而便宜地遍历二叉树。IPL 9(1979)197-200 DOI:10.1016 / 0020-0190(79)90068-1
然后还有Lindstrom扫描。此方法“旋转”每个节点(父级和两个子级)中涉及的三个指针。如果要执行任何体面的预排序或后排序算法,则每个节点需要额外的位。如果您只想访问所有节点(3次,但是您不知道要执行哪一次访问),那么就可以做到这一点。
G. Lindstrom:扫描没有堆栈或标签位的列表结构。IPL 2(1973)47-51。DOI:10.1016 / 0020-0190(73)90012-4
也许最直接的方法是Robson的方法。在这里,经典算法所需的堆栈穿过叶子。
JM Robson:一种改进的算法,用于遍历没有辅助堆栈IPL 1(1973)149-152的二叉树。10.1016 / 0020-0190(73)90018-5
IPL =信息处理信函