接着上面一篇博客,我们开始叙述有关二叉树的非递归遍历的实现。

这里我们附上上一篇blog的链接:https://blog.csdn.net/weixin_36997518/article/details/81370049,废话少说,直接上代码。

首先是二叉树的中序遍历,这是二叉树尤为重要的一种遍历方式,虽然它在三种非递归方式中是最简单的,但是很多算法都是基于这种方法进行再创作。

//中序遍历非递归方法
void tree::non_InOrder(node *t) {if (t == NULL) {return;}node *p = t;stack<node*> s;//借助栈s来实现中序遍历while (p || !s.empty()) {if(p) {s.push(p);p = p->lchild;}else{p = s.top();cout << p->data << endl;s.pop();p = p->rchild;}}
}

前序遍历非递归方式:它和中序遍历可以说是完全相同,只是输出节点的位置略有不同而已。

//前序遍历非递归算法
void tree::non_PreOrder(node *t) {if (t == NULL) {return;}node *p = t;stack<node*> s;//和中序遍历一样的过程,只是顺序改变了while (p || !s.empty()) {if(p) {cout << p->data << endl;s.push(p);p = p->lchild;}else {p = s.top();s.pop();p = p->rchild;}}
}

后序遍历:这是三种遍历方法中最为复杂的一种,因为它的根节点是最后访问的,在我们出栈遇到该节点时,我们并不知道此时它的右子树是否被访问过,所以我们需要额外借助一个节点变量用来判断右子树的访问真值。

//后序遍历非递归方法,这个和中序还有前序有一些区别
void tree::non_PostOrder(node *t) {if (t == NULL) {return;}node *p=t, *pre=NULL;stack<node*> s;while (p || !s.empty()) {if (p) {s.push(p);p = p->lchild;}else {p = s.top();if (p->rchild&&p->rchild != pre) {//此时右子树还未遍历过,需要进行遍历p = p->rchild;s.push(p);p = p->lchild;}else {//当右子树已经遍历过时,此时应该进行节点的输出s.pop();cout << p->data<<endl;pre= p;p = NULL;}}}
}

以上就是三种遍历算法的非递归方式。这里给出完整的代码:

// 二叉树的构建.cpp: 定义控制台应用程序的入口点。
//作者:Daviu Liu#include"stdafx.h"
#include<iostream>
#include<fstream>
#include<string.h>
#include<stack>
using namespace std;typedef struct node {int data;struct node *lchild;struct node *rchild;//struct node(int x) :data(x), lchild(NULL), rchild(NULL) {};这种方法能够快速的构建节点
}node,*BiTree;//二叉树的各种方法
class tree
{
public:node *make_node(int number, string location);node *root;void non_PreOrder(node *t);void non_InOrder(node *t);void non_PostOrder(node *t);//这里存放求树的深度等方法,先不写
};//先序遍历的方法构建二叉树,这里我使用了递归,非递归的话也可以
//非递归方法将在之后给出
node* tree::make_node(int number, string location) {int data;node *p = new node;cout << "请输入节点数据 " << endl;cin >> data;if (data == 0)//这里是用data=0代表空节点,要求每个叶子结点都要写出来,不然连树都不是{return NULL;}p->data = data;p->lchild = make_node(number + 1, "left");p->rchild = make_node(number + 1, "right");return p;
}
//中序遍历非递归方法
void tree::non_InOrder(node *t) {if (t == NULL) {return;}node *p = t;stack<node*> s;//借助栈s来实现中序遍历while (p || !s.empty()) {if(p) {s.push(p);p = p->lchild;}else{p = s.top();cout << p->data << endl;s.pop();p = p->rchild;}}
}//后序遍历非递归方法,这个和中序还有前序有一些区别
void tree::non_PostOrder(node *t) {if (t == NULL) {return;}node *p=t, *pre=NULL;stack<node*> s;while (p || !s.empty()) {if (p) {s.push(p);p = p->lchild;}else {p = s.top();if (p->rchild&&p->rchild != pre) {//此时右子树还未遍历过,需要进行遍历p = p->rchild;s.push(p);p = p->lchild;}else {//当右子树已经遍历过时,此时应该进行节点的输出s.pop();cout << p->data<<endl;pre= p;p = NULL;}}}
}//前序遍历非递归算法
void tree::non_PreOrder(node *t) {if (t == NULL) {return;}node *p = t;stack<node*> s;//和中序遍历一样的过程,只是顺序改变了while (p || !s.empty()) {if(p) {cout << p->data << endl;s.push(p);p = p->lchild;}else {p = s.top();s.pop();p = p->rchild;}}
}int main()
{tree T;T.root = T.make_node(1,"root");cout << "先序遍历的(非递归)结果是:" << endl;T.non_PreOrder(T.root);cout << "中序遍历的(非递归)结果是:" << endl;T.non_InOrder(T.root);cout << "后序遍历的(非递归)结果是:" << endl;T.non_PostOrder(T.root);return 0;
}

附上运行结果(包括递归方式):

明天将会更新二叉树最重要的层次遍历和二叉树的线索化内容

二叉树的非递归算法(C++实现)相关推荐

  1. 数据结构——二叉树的非递归算法

    二叉树的非递归算法 先序遍历非递归算法1 先序遍历非递归算法2 非递归交换左右孩子算法 使用栈来实现二叉树的非递归算法 栈的基本算法 #include<stdio.h> #include& ...

  2. (※)中序遍历二叉树的非递归算法

    在此之前,我们已经学习了中序遍历二叉树的递归算法,相信大家已经将其牢牢掌握了. 除了使用递归思想作为求解问题的钥匙,还可以借助栈来以非递归方式实现该问题的求解. 首先,我们要讨论存储二叉树结点信息的栈 ...

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

    编写的方法:根据树中结点的遍历规律及顺序直接写出其非递归算法. 先序非递归算法 [思路] 假设:T是要遍历树的根指针,若T != NULL 对于非递归算法,引入栈模拟递归工作栈,初始时栈为空. 问题: ...

  4. 树与二叉树——后序遍历二叉树的非递归算法

    算法思想:后序非递归遍历二叉树是先访问左子树,再访问右子树,最后访问根节点. ①若根节点有左孩子,则左孩子以此入栈,直到左孩子为空,然后读取栈顶元素,若其右孩子不为空且未被访问过,则对右子树执行①.否 ...

  5. 创建二叉树的非递归算法实现

    非递归创建二叉树(中序)算法核心思路: 1)从根节点到左子树的叶子节点(创建节点.节点压栈): 2)记录每个节点的状态分三种情况:初始状态.左子树建立完成状态.右子树建立完成状态: 3)左右子树创建完 ...

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

    遍历二叉树的递归算法与非递归算法 先来看下面这棵二叉树.如图1.现在我们要对它进行先序遍历.递归思想:就是把这个大树拆分成N棵小树,每棵小树都进行一次先序遍历.再把这些遍历连合起来就是这棵树的先序遍历 ...

  7. 递归算法到非递归算法的转换

    递归实质在定义自身的同时又出现了对自身的调用.递归算法是许多软件编程人员常用的方法,结构简单.清晰.可读性好.但在实际应用中也存在一些问题:1.并不是每一门语言都支持递归,比较典型的FORTRAN语言 ...

  8. 二叉树的非递归遍历算法C语言实现(详细注释版)

    二叉树的非递归算法遍历分为:先序遍历,中序遍历,后序遍历. 此文章我会根据先.中.后的顺序为大家用C语言实现全部代码. 顾名思义先序遍历是先遍历根节点,随后是左孩子,右孩子 . 中序遍历与后序遍历可以 ...

  9. 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...

    二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...

最新文章

  1. c语言博客作业02--循环结构
  2. python操作hive数据库代码_Python连接Hive操作数据库
  3. REVERSE-PRACTICE-BUUCTF-32
  4. python radians函数_Python3 radians() 函数
  5. 长假大考充电桩:堵车不可怕,没电才尴尬
  6. Epic融资20亿,离元宇宙更进一步
  7. MongoDB3.x中添加用户和权限控制
  8. 苹果系统摩尔庄园是什么服务器,摩尔庄园手游官服和渠道服有什么区别_可以一起玩吗_官服和渠道服详细介绍...
  9. java+MySQL基于ssm的公文流转关管理系统
  10. 阿里巴巴2017实习面试
  11. 一张图看明白云计算数据中心总体分层架构
  12. 金龙云介绍——城轨云相关
  13. 查验身份证 浙大陈越习题
  14. Mega使用及R语言中多序列比对
  15. 如何将你的网站提交到Google
  16. 阅读笔记-原生家庭·如何修补自己的性格缺陷
  17. 单相远程费控智能电表使用指南
  18. 2022重庆幼教产业展览会|高科技玩具益智解压玩具博览会
  19. 政策东风,助推万亿智能家居产业,2022各地智能家居政策大盘点
  20. android 点击收藏,【Android】3.21 示例21—兴趣点收藏功能

热门文章

  1. linux的触摸板驱动有哪些?
  2. 微信小程序报错TypeError: Cannot read property ‘0‘ of undefined
  3. 花书读书笔记(十一)-应用
  4. vue3+vite+ts 封装axios踩坑记录
  5. 华硕电脑的BIOS设置从U盘启动
  6. 翻译|R用于研究,Python用于生产
  7. IDEA本地项目关联远程Git远程仓库
  8. 解决腾讯云服务器存在端口(6379)对外攻击行为
  9. Python绘制图像的灰度直方图、累计直方图
  10. 生物药公司“普米斯”获1.8亿元融资,华金资本、珠海高科创投、弘晖资本联合投资...