#include <iostream>
#include <vector>
#include <stack>using namespace std;//思路分析
//先构造一个二叉树
//对二叉树的每一个结点,分别有三种状态标记,分别是1.准备开始遍历左子树 2. 准备开始遍历右子树 3. 准备开始遍历根自己
//初始化两个vector,一个用于存放路径pathStack,用于回溯,
//一个用于存放遍历结果valueVec,对于先序遍历,根要最先放入,所以在准备开始遍历左子树的时候就要放入valueVec
//然后依次遍历每一个节点,及时修改节点的遍历状态和路劲vectypedef struct node
{int val;struct node* left;struct node* right;
}node_t;vector<int> valueVec;
stack<node_t*> pathStack;using namespace std;void traverse_value_vec()
{for (int i = 0; i < valueVec.size(); i++){cout << valueVec[i] << endl;}
}void order_traversal(node_t* root)
{node_t* current_node = root;int state = 1;//1是遍历左 2是遍历右 3是遍历上while (current_node != NULL){if (state == 1){//先序遍历,在即将遍历左子树的时候就要把当前节点(此树的根节点)放入valueVec//valueVec.push_back(current_node->val);//开始处理他的左子树,先看看有没有左子树if (current_node->left != NULL){//如果有左子树,就要先去处理他左边的那棵树了,处理之前,要把它放入路径栈内,回溯的时候要用到这个节点pathStack.push(current_node);//转移要处理的节点为他的左子树的根current_node = current_node->left;//处理即将要处理的节点的状态为左边state = 1;}else{//如果没有左子树,那么就要去处理棵树的右子树,改变处理状态标记state = 2;}}else if (state == 2){//中序遍历,在即将遍历右子树的时候就要把当前节点(此树的根节点)放入valueVec,没有先把一棵树的根放进去,左边树该放的放完以后才放的根valueVec.push_back(current_node->val);//开始处理他的左子树,先看看有没有左子树if (current_node->right != NULL){//如果有左子树,就要先去处理他左边的那棵树了,处理之前,要把它放入路径栈内,回溯的时候要用到这个节点pathStack.push(current_node);//转移要处理的节点为他的左子树的根current_node = current_node->right;//处理即将要处理的节点的状态为左边state = 1;}else{//如果没有左子树,那么就要去处理棵树的父节点了,改变处理状态标记state = 3;}}else if (state == 3){//左右都处理完了,该处理根了,处理根就需要用到pathStack进行回溯了node_t* father = NULL;if (!pathStack.empty()){//该节点存在父节点//取出父节点father = pathStack.top();pathStack.pop();//判断刚刚处理的节点是不是此父亲的左边树,如果是的话,就该处理它右边的子树了,否则,就应该处理这个父亲的父亲,state仍然保持为父亲的状态if (current_node == father->left){state = 2;}//else//{//   state = 3;//}}//开始观察当前节点的父节点//如果上述代码中栈中有元素,那么father有值,去处理刚刚处理的那个节点的父节点//如果上述代码中栈中没有元素,那么father没有值,会跳出循环current_node = father;}}
}int main()
{//构建一个node_t root;root.val = 1;node_t node2;node2.val = 2;node_t node3;node3.val = 3;node_t node4;node4.val = 4;node_t node5;node5.val = 5;node_t node6;node6.val = 6;node_t node7;node7.val = 7;root.left = &node2;root.right = &node3;node2.left = &node4;node2.right = &node5;node3.left = &node6;node3.right = &node7;node4.left = NULL;node4.right = NULL;node5.left = NULL;node5.right = NULL;node6.left = NULL;node6.right = NULL;node7.left = NULL;node7.right = NULL;order_traversal(&root);traverse_value_vec();
}

二叉树遍历(非递归遍历)相关推荐

  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. php中文乱码问号,如何解决PHP中文乱码问题?
  2. 只需 4 步,自己搞个 Spring Boot Starter!
  3. PDU是如何帮助机房安然度夏?如何选择PDU电源配套机柜?
  4. PM2.5检测 -- PMS7003 串口测试
  5. centos MySQL 双机_CentOS利用Keepalived构建双主MySQL+双机热备
  6. 并发调试和JDK8新特性
  7. python分类算法的应用_07-机器学习_(lineage回归分类算法与应用) ---没用
  8. C#3.0之神奇的Lambda表达式和Lambda语句
  9. 学生选课系统的源码-代码布局截图
  10. cmake编译时不能指定头文件路径?
  11. editplus显示FTP服务器连接,EditPlus3 FTP 设置对话框
  12. Latex排版—(1)基础排版
  13. 用这几种方式清理Mac缓存,你的Mac就不会卡了
  14. 美学心得(第二百三十七集) 罗国正
  15. android 系统相册 多远,【系统相册】Android 保存图片到系统相册
  16. backtrader最大的坑:没有内置处理涨跌停板
  17. HM不只是到处开实体店了,这次它不想错过天猫新零售
  18. 一篇文章带你了解python数据分析岗位怎么样
  19. 2008年8月20号,星期二,晴。青,取之于蓝而青于蓝;冰,水为之而寒于水。——《荀子•劝学》
  20. Subsonic学习

热门文章

  1. scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...
  2. Matlab R2012a/b反复激活无效+license checkout failed解决方案
  3. 【YOLOv5】连接手机摄像头进行目标检测
  4. 生成组合仿射变换矩阵,裁剪+缩放+平移+斜切+旋转
  5. 大数据报告|70%的中国人过劳死危险,其中有你吗?
  6. OpenCV-Python根据鼠标点击位置截取ROI
  7. 嵌入式Linux开发_Ping来Ping去
  8. x264源代码简单分析 编码器主干部分-1
  9. Matlab对图像进行裁剪。seam carving
  10. 大数据的五大关键技术