先将 top下移一个单位,然后返回所指向的log对象,也就是*top。
接下来该深入讲解套路了,首先,根节点设置成了dummy,这是一个虚拟节点,是为了保证最上层只有一个节点而使用的编码技巧,好比tree命令输出目录树总是从当前目录“.”开始。由于第一次进入循环,log堆栈为空,不存在所谓回溯点,我们将回溯位置索引设为0,这有两重含义,一来表示该回溯点无效或不存在,二来既然没有回溯,那么接下来就从当前节点的第一个分支开始遍历。
然后我们将遍历过的节点压栈,这里也是有区分的:如果当前是叶子节点,或者所有分支都遍历完了,那么应该继续上溯去寻找回溯点,我们就将回溯点设为无效后压栈;否则就将当前节点设为回溯点,并记录位置索引后压栈。
画线输出部分稍后讲。我们根据前面获取的索引sub_idx进入下一层,直到触底回溯,这时从log堆栈弹出回溯点,pop有三种情况:由于第一个压栈为根节点,堆栈为空表示回溯到原点,也就标志着整个遍历结束,退出循环;否则查看回溯点是否为NULL,如果空如前所述继续上溯;如果存在有效回溯点,则将回溯位置索引取出,继续下一轮遍历循环。
最后讲终端输出。前面说过每一行从左至右的输出的是树的层次遍历,其实就是遍历log堆栈;换行输出就是树的分支遍历,就是每一轮循环。输出内容主要是三个符号:缩进、分支和节点内容。我们作如下策略: