我之前的一篇学术课程中有以下关于二阶树(不是BST)的有序遍历(它们也称之为pancaking)的文本:
有序树遍历
在树的外面画一条线.从根的左侧开始,绕过树的外部,最后到根的右侧.尽可能靠近树,但不要越过树.(想想树 - 它的分支和节点 - 作为一个坚实的障碍.)节点的顺序是这条线在它们下面经过的顺序.如果您不确定何时"在节点下面",请记住"左侧"节点始终位于第一位.
这是使用的示例(从下面略微不同的树)
但是,当我在谷歌搜索时,我得到一个相互矛盾的定义.例如维基百科的例子:
顺序遍历序列:A,B,C,D,E,F,G,H,I(左子节点,根节点,右节点)
但根据(我的理解)定义#1,这应该是
A,B,D,C,E,F,G,I,H
任何人都可以澄清哪个定义是正确的?它们可能都描述了不同的遍历方法,但碰巧使用相同的名称.我很难相信同行评审的学术文本是错误的,但不能确定.
在我对绘图的不良尝试中,这是显示如何挑选它们的顺序.
几乎选择正在绘制的线上方的节点.
忘记定义,只需应用算法就容易多了:
void inOrderPrint(Node root) { if (root.left != null) inOrderPrint(root.left); print(root.name); if (root.right != null) inOrderPrint(root.right); }
这只是三行.重新排列订单前后的订单.