接下来该深入讲解套路了,首先,根节点设置成了dummy,这是一个虚拟节点,是为了保证最上层只有一个节点而使用的编码技巧,好比tree命令输出目录树总是从当前目录“.”开始。由于第一次进入循环,log堆栈为空,不存在所谓回溯点,我们将回溯位置索引设为0,这有两重含义,一来表示该回溯点无效或不存在,二来既然没有回溯,那么接下来就从当前节点的第一个分支开始遍历无限层次树形笔记本。
然后我们将遍历过的节点压栈,这里也是有区分的:如果当前是叶子节点,或者所有分支都遍历完了,那么应该继续上溯去寻找回溯点,我们就将回溯点设为无效后压栈;否则就将当前节点设为回溯点,并记录位置索引后压栈。
无限层次树形笔记本 画线输出部分稍后讲。我们根据前面获取的索引sub_idx进入下一层,直到触底回溯,这时从log堆栈弹出回溯点,pop有三种情况:由于第一个压栈为根节点,堆栈为空表示回溯到原点,也就标志着整个遍历结束,退出循环;否则查看回溯点是否为NULL,如果空如前所述继续上溯;如果存在有效回溯点,则将回溯位置索引取出,继续下一轮遍历循环。
无限层次树形笔记本 最后讲终端输出。前面说过每一行从左至右的输出的是树的层次遍历,其实就是遍历log堆栈;换行输出就是树的分支遍历,就是每一轮循环。输出内容主要是三个符号:缩进、分支和节点内容。我们作如下策略:
缩进:当堆栈里回溯点无效,则不存在分支,打印空格,八个字符对齐; 分支:当堆栈里回溯点有效,表示存在分支,打印“|”和空格,八个字符对齐; 节点:当堆栈遍历到最后一个元素,表示后面将要输出节点内容,打印“+---”,八个字符对齐,后面跟节点内容。
当然你也可以自定义打印策略以便输出更美观。好了,说了一大堆,看效果吧无限层次树形笔记本,运行程序,一目了然。
<文章地址:https://www.tianxianmao.com/article/other/xjtopxyygdwrhfhszxdlogdxyjstop.html