5.4.3树和森林的遍历
知识总览:
树的逻辑结构:
树是一种递归定义的数据结构,可以用递归算法实现对树的遍历(不知道,可能吧。。。。。)
树的先根遍历:
根节点不为空,先访问根节点,然后再对根节点的各个子树进行先序遍历访问,访问时按照从左到右子树的顺序进行访问
如下:根节点为A,A的子树为B、C、D,即A BCD的顺序,再从左到右对B的子树进行先序遍历根左右即BEF(即对B进行拆分),E还有分支,再对E的分支进行先序遍历访问即EK则为ABEFK,再对A的子树C进行先序遍历即CG,再对D的子树进行先序遍历,先H且H无分支再对I节点进行访问I无分支再对J进行先序遍历访问J无分支则结束
代码同根节点不为空访问根节点,然后判断根节点是否还有子树,有的话开始递归!!!大概是这样吧。。。。。。
树的后根遍历:
如果树不空,依次对每个子树进行后跟遍历最后访问根节点
如下:按照左右根的顺序是B、C、D、A,依次先对B进行后根遍历,B有分支则对B后跟遍历为EFB,E节点还有分支则对E后根遍历为KE即KEFBCD,再对C分支后根遍历为GC,再对D分支后根遍历HIJD(D是根节点最后访问,HIJ子树从左到右依次进行后跟遍历,因为都没有分支直接为HIJ)即KEFBCDGCHIJDA
代码同都是递归遍历,先递归各个子树后根遍历,最后根节点访问
树的后根遍历+先根遍历=树的深度优先遍历,优先往深处走
树的层次遍历:
和二叉树同都是一层层遍历,用一个辅助队列先根节点(树不为空)入队,然后队列不为空则队头根节点出队访问根节点,再根节点的孩子入队,再依次队头出队,队头的孩子节点入队,重复这个步骤直到队列为空
森林的 先序遍历:
森林由多个树构成,把每个树去掉根节点后当前树剩下的节点又在当前树中组成了一个森林。
即对各个树进行先序遍历最后把序列组合在一起即可
如下图对根节点为B的树进行先序遍历,跟上述例子同即为BEKLF,再对根节点为C的树进行先序遍历,上同CG,再对D根节点进行先序遍历即DHMIJ,合在一起即为BEKLFCGDHMIJ
或者把森林先转成二叉树,转成求二叉树的先序遍历,因为森林的先序遍历和二叉树的先序遍历同
森林的中序遍历:
即对各个树进行中序遍历最后把序列组合在一起即可
如下图对根节点为B的树进行后根遍历(左右根),上同例子为KLEFB,再对根节点为C的树进行后根遍历,即GC,再对D根节点进行后根遍历即MHIJD,合在一起即为KLEFBGCMHIJD
或者把森林先转成二叉树,转成求二叉树的中序遍历,因为森林的中序遍历和二叉树的中序遍历同
如果考试中考到了森林的代码题建议转成二叉树形态
知识回顾:
。。。。。。。。。。。不知道在记录什么。。。。。。。