提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、创建一棵二叉树
  • 二、具体步骤
    • 1.思路
    • 2.部分代码
  • 总结

前言

二叉树的遍历通常采用递归遍历的方式,而非递归遍历二叉树需要使用到栈,利用栈的先进后出的存储特性可实现对树的非递归遍历。


一、创建一棵二叉树

如图所示:

它的先序遍历为:ABCDEFGH
它的中序遍历为:BDCEAFHG
它的后序遍历为:DECBHGFA

二、具体步骤

1.思路

(1)新建一个结构体包含二叉树节点指针以及标志位flag。

struct BinaryTreeStackNode
{BinaryNode* root;int flag;
};

(2)在创建栈之后首先将根节点压入栈中,将此节点的标志位设置为FALSE。

(3)之后开始判断栈内是否为空,不为空则并往外弹出数据,取得栈顶节点,判断取出根节点是否为空,为空则continue继续循环,否则将判断标志位是否为TRUE,若为TRUE则输出此根节点的值,若为FALSE则将其标志位设置为TRUE,(这里为先序遍历)之后依次压入此根节点的右孩子,与左孩子,并将二者的标志位设置为FALSE,最后压入此根节点。与先序遍历的顺序恰好相反。

(4)若是中序或者是后续,在压入栈节点时只需按照与遍历顺序相反的顺序压入即可,节点第一次压入时标志位都为FALSE,在作为栈顶节点弹出式再修改为TRUE。

2.部分代码

//创建栈中的节点
BinaryTreeStackNode* CreateBinaryTreeStackNode(BinaryNode* node1, int flag)
{BinaryTreeStackNode* bsn = new BinaryTreeStackNode;bsn->root = node1; //node1为外部传入的当前根节点bsn->flag = flag;  //flag为标志位return bsn;
}void NonRecursion(BinaryNode* root)
{//创建栈stack<BinaryTreeStackNode*> s;s.push(CreateBinaryTreeStackNode(root, MY_FALSE));while (s.size()> 0) {BinaryTreeStackNode* node = s.top();s.pop();if (node->root == nullptr){continue;}if (node->flag == MY_TRUE){cout << node->root->value;}else{node->flag = MY_TRUE;//先序遍历//右入s.push(CreateBinaryTreeStackNode(node->root->rchild, MY_FALSE));//左入s.push(CreateBinaryTreeStackNode(node->root->lchild, MY_FALSE));s.push(node);}}
}

结果演示示例:


总结

以上就是今天要讲的内容,本文仅仅简单介绍了二叉树的非递归遍历,可以作为遍历二叉树时的一种思路。

二叉树的非递归遍历 C++相关推荐

  1. 刷题:二叉树的非递归遍历方式

    二叉树的非递归的遍历方式 上篇博客记录了二叉树的递归遍历方式以及根据二叉树的遍历结果还原二叉树的内容. 本篇博客记录二叉树的非递归的遍历方式. 二叉树的非递归遍历需要借助栈来实现,而且三种遍历的方式的 ...

  2. 二叉树的非递归遍历(c/c++)

    由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...

  3. 二叉树的非递归遍历(统一的模板)

    二叉树的非递归遍历 前言 树的存储结构 先序遍历 先序的递归遍历 先序的非递归遍历 中序遍历 中序的递归遍历 中序遍历的非递归算法 后序遍历 后序的递归遍历 后序的非递归遍历 层次遍历 层次遍历获得每 ...

  4. 数据结构-二叉树的非递归遍历

    前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁:辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它 ...

  5. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  6. 树:二叉树的非递归遍历算法

    二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...

  7. 6-9 二叉树的非递归遍历 (20 分)

    ** 6-9 二叉树的非递归遍历 (20 分) ** 本题要求用非递归的方法实现对给定二叉树的 3 种遍历. 函数接口定义: void InorderTraversal( BinTree BT ); ...

  8. C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)

     二叉树的非递归遍历C/C++实现:   非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历struct tree* t ...

  9. C语言实现二叉树的非递归遍历

    C语言实现二叉树的非递归遍历: 代码解释: 非递归前序遍历:1> 首先建立一个二维指针,用来存储每个结点的地址,定义栈顶指针top,初始值为-1,并将根结点存入栈中,top++:2> 进入 ...

  10. 二叉树的非递归遍历(C语言实现)

    上一篇讨论了二叉树的的递归遍历,这一次讨论二叉树的三种非递归遍历 二叉树的非递归遍历采用栈实现,首先给出二叉树和栈的定义 #define STACK_INIT_SIZE 100 #define STA ...

最新文章

  1. 收藏 | 使用Mask-RCNN在实例分割应用中克服过拟合
  2. 数组, 数组的初始化
  3. 【Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 /proc/meminfo 文件 | /proc/meminfo 重要字段解析 )
  4. .Net NPOI 根据excel模板导出excel、直接生成excel
  5. 陶哲轩的10岁与30岁
  6. 关于深度学习,我们4年时间写了一本1400页的全栈手册
  7. 剑指Offer:打印从1到最大的n位数
  8. 华为或将推出“华为搜索”;​飞书回应微信指控;Fuchsia OS 进入开发者试用阶段 | 极客头条...
  9. git21天打卡day15-添加提交修改文件
  10. 如何做跟进客户关系维护PPT课件?
  11. 京瓷p5018cdn教程_京瓷ECOSYS P5018cdn驱动
  12. mac开启HiDPI
  13. oracle安装以及访问【3】在CentOS7中安装oracle11g
  14. 典故:一文钱难倒英雄汉
  15. Python——数字金字塔
  16. 计算机视觉公司 摘过来,以后看看
  17. NVDIA Jetson TX2软件介绍
  18. TPAMI 2022 | 金字塔池化的骨干网络,各大任务都涨点!南开达摩院联合推出P2T
  19. 积分有效期的设计处理方案
  20. 多分类学习与类别不均衡

热门文章

  1. 使用Python GDAL库对高分三号全极化SAR影像进行RPC几何校正(PolSARpro格式)
  2. 什么是区块链? 区块链的入门教程~
  3. 向日葵linux版远程怎么打开,使用向日葵app远程控制你的Mac笔记本 之小白使用指导...
  4. QQ自动播放动态视频json卡片怎么换地址
  5. 在html用vue组件,html页面引入vue组件
  6. 发那科机器人xyz的方向_最全 | 发那科工业机器人示教器详细介绍
  7. Flink POJO类状态使用注意事项
  8. 花一分钟彻底搞懂Mac输入法/中英文/大小写切换
  9. 【算法】合并两个有序链表
  10. win10 -- 注册机认为是病毒,死活不让下载 --那就关了它的自带杀毒软件