美文网首页
二叉树非递归遍历实现代码(深度遍历)

二叉树非递归遍历实现代码(深度遍历)

作者: sakura579 | 来源:发表于2020-09-03 08:20 被阅读0次


栈的先进后出特性

也就说 一次次的保护现场操作所保存下来的内容,被压入一个栈中。
而恢复现场,恰好是把原来保存栈中的那些内容,挨个弹出,恢复保存的状态。

实现递归函数 其中有个非常重要的角色 - 栈
当你使用递归函数的时候,这个栈 你是看不到的,是系统栈,系统默默做了这些事情。

总结:
首先从根节点开始,入栈一个节点,然后不停重复一下操作:

如果栈不空,就出栈一个元素,并对其访问,之后再检测其左、右孩子是否为空,如果为空,则不需要其左、右孩子入栈,否则需要入栈,注意入栈顺序,右孩子先入栈,左孩子后入栈。
如果栈为空,说明 整个遍历结束
这就是借助我们自己设定的栈 实现先序遍历的方法。

preorder
vt. 预订
n. 前序

recursion
n. [数] 递归,循环;递归式

出栈是在循环内,在栈空判断之后执行的,
哪怕此时因为出栈 导致栈空,循环的判断已经结束了,暂时不会判断,
并且下面紧跟着入栈操作。

所以即便中间栈空,循环也不会断掉,除非此时栈空 且后面没有左右孩子可以入栈,才会导致循环结束。此时恰好 遍历完成。

逆后序 是把逆序倒过来。
先序遍历 :先遍历根结点,然后遍历左子树,再遍历右子树
后序遍历 :先遍历左子树 ,然后遍历右子树,再遍历根结点
逆后序遍历 :先遍历根结点,然后遍历右子树,再遍历左子树

先序遍历 和 逆后序遍历 区别:仅仅在 左右子树 的遍历顺序不同。

交换 左右子树 遍历顺序

最后把逆后序遍历序列 逆过来:
外加一个辅助栈,把逆后序遍历序列 压入栈中 ,再逐个出栈 ,就得到后序遍历序列。

postorder
n. [计] 后根次序;后缀次序

从根节点开始,沿着左孩子指针 ,一直往左走,直到遇到左孩子指针为空的节点,把所途径的节点全部入栈, 然后出栈一个节点,并访问这个节点,然后检测其右孩子是否存在,存在则取其右孩子入栈,从其右孩子开始,重复之前的过程,一直往左走,并把途径的节点全部入栈,直到来到左孩子为空的节点,出栈节点并访问,取其右孩子。。。(做重复的事情);不存在则继续出栈。

从根节点开始,一直往左走,途径节点全部入栈,直到左节点为空,出栈一个,先往右走一步,再一直往左走。。。

inorder
n. 中根次序

外层循环条件的条件 :栈不空 或者 p不空 即 top != -1 || p!= NULL

如果栈不空的时候,出栈一个元素,若恰好导致栈空,
此时栈空,p往右走一步,恰好出栈元素的右孩子不空,还有节点需要遍历。
若此时回到主循环条件那里,如果仅对 栈空 进行判断的话,此时就该跳出循环,剩下节点无法遍历,因此定上 p不空的判断条件。

相关文章

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 5. 深度优先、广度优先

    1. 二叉树的深度优先遍历和广度优先遍历2. 深度优先搜索递归和非递归实现 深度优先(DFS):前序遍历 广度优先...

  • 二叉树的遍历实现递归与非递归

    本文实现了二叉树的深度遍历算法,分为递归与非递归 递归的实现非常简单,基本上没啥难度 非递归的实现需要根据遍历的顺...

  • 二叉树

    结构体 创建二叉树 递归遍历 栈操作 非递归遍历 层次遍历 完整代码

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 深入浅出二叉树遍历的非递归算法 2019-11-15(未经允许,

    1、二叉树遍历的递归算法 递归实现二叉树的遍历非常直观,回顾一下递归的代码: 前序遍历 中序遍历 后序遍历 他们的...

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 二叉树递归非递归遍历算法整理

    一、二叉树前序遍历 1 前序递归遍历 2.前序非递归遍历 一、二叉树中序遍历 2.中序递归遍历 1.中序非递归遍历...

  • Tree

    二叉树的深度优先遍历使用递归实现的时候又叫递归遍历,递归就是函数调用自己,同时需要明确递归的出口。递归遍历可以分为...

网友评论

      本文标题:二叉树非递归遍历实现代码(深度遍历)

      本文链接:https://www.haomeiwen.com/subject/krivsktx.html