二叉树的非递归遍历

二叉树的非递归遍历

回顾一下浙大的数据结构课程,看PPT过程中发现有的地方理解的不到位,去B站搜了这视频便于理解,讲的非常好,细节到位。本博客贴出了一些关键点便于大家参考,具体实例步骤可以去视频看,更加详细便于个人理解。

视频链接 : 二叉树的非递归遍历

1. 先序遍历
二叉树的非递归遍历

两步走:
1. 沿着根节点一直访问节点(打印)(实际上对应的是中间节点),并不断将节点压栈,此步骤一直执行到左子树为空
2. 出栈一个节点(中间节点),转向此节点的右子树

循环第一步和第二步

二叉树的非递归遍历
二叉树的非递归遍历
二叉树的非递归遍历
2. 中序遍历

与先序遍历简直如出一辙,就是需要先打印节点
二叉树的非递归遍历

三步走

1. 从根节点开始不断沿着左子树节点下沉,过程中将节点(对应中间节点)不断入栈,此过程一直持续到左子树为空
2. 出栈一个节点(中间节点),进行访问(打印)
3. 转向此中间节点的右子树

循环上面的过程

二叉树的非递归遍历
二叉树的非递归遍历
3.后序遍历

后续遍历比前两个麻烦,需要两次入栈,两次出栈。(1)中的不出栈改为出栈,应该是PPT写错了。
二叉树的非递归遍历
分四步

1. 首先从根节点不断指向其左子树,并且入栈(便于后面出栈寻找右子树),此过程执行到左子树为空。
2. 出栈一个节点(中间节点),指向这个节点的右子树,并且将这个中间节点入栈。
3. 接下去应该是循环上面两个步骤,也即把当前中间节点的右子树节点当作根节点进行1和2,最终达到的效果是右子树被访问完成。
4. 出栈一个节点并进行访问,这个节点对应那个中间节点。

tip:用了一个flag标志位用于判断出栈的时候是访问左子树完成,还是右子树访问完成。
二叉树的非递归遍历