本文部分图片截取自B站懒猫老师。
视频链接为:https://www.bilibili.com/video/BV1qV411f77r?spm_id_from=333.999.0.0.
二叉树的遍历操作
首先,判断传入的根节点 bt,它的值是否为空。如果为空,就直接返回。这也是递归算法的出口。注意:递归必须要有出口(结束条件)
C++定义二叉树的方法
C语言定义二叉树的方法
二叉树的前序遍历详解
存储结构 – 二叉链表
遍历操作过程
遍历操作过程 – 递归算法
以下图为例,
以下图为例,
上图中的语句 visit(bt->data);的作用可以直接理解为输出bt所指向结点的数据域,这里即结点 A 的值。
当程序执行到 PreOrder(bt->lchild); 时,即开始递归调用。
但在进行递归调用之前,首先要进行一项特别重要的事情。-- 保护现场,即要将当前执行的是哪一个语句和此时结点的状态压入到系统栈中。
当压栈完成,保存了现场之后,重新开始一段代码。
因此,在判断时,因为为空,所以直接返回。
但在进行递归返回之前,也要进行一项特别重要的事情。-- 恢复现场,即将上一次执行的那个语句和那时的结点的状态从系统栈中出栈。
也就是例子中的回到第五行,再将bt的指向恢复到A结点。
因为从系统栈中出栈了,所以栈中就没数据了。
紧接着执行第六行的递归调用,采用与上面同样的步骤进行。
在保存现场之后,将A的右子树C传给bt,从而bt指向C。
然后对bt的指向进行判断,看看是否为空,因为bt指向C,所以bt指向不为空,接着输出C,然后继续执行,也就是要再次递归,但在递归之前还要继续保存现场,保存现场之后,重新开始一段代码。
后面的步骤与上面大同小异了,再此不再继续分析。