在前面C++实现二叉树的递归遍历(详细步骤与代码实现)我们实现二叉树通过递归遍历实现了先序、中序与后续遍历,那么如何通过非递归遍历实现先序、中序与后续遍历呢?我们先看看非递归遍历规则。

还是同样的二叉树

1、首先将二叉树根节点A放入栈中,并将节点是否打印标签设为false。

2、再将节点A从栈中弹出,将其左右子树节点BF入栈,打印标签设为false,将A再次入栈,此时是否打印的标签设为true(注意这里三个节点入栈顺序与先序、中序与后续遍历方式有关,入栈顺序与遍历顺序正好相反,如果为先序遍历DLR,入栈顺序就应该为RLD)

3、再从栈中取出栈顶元素,重复2的步骤,本身与左右子树分别入栈,本身打印标签改为true,左右子树打印标签设为false。

4、如果从栈中取出的栈顶元素打赢标签为true,则直接打印,并取下一个栈中元素。

下面是具体实现的代码:

1、栈的定义与操作

//栈的定义与操作
//节点
class linknode
{
public:linknode* next;
};
//自定义数据
class my_data
{
public:linknode* node;char data;
};
//链式栈
class linkstack
{
public:linknode head;int size;
};
//初始化栈
linkstack* init_linkstack()
{linkstack* stack=new linkstack;stack->head.next=NULL;stack->size=0;return stack;
}
//入栈
void push_linkstack(linkstack* stack,linknode* data)
{data->next=stack->head.next;stack->head.next=data;stack->size++;
}
//出栈
void pop_linkstack(linkstack* stack)
{stack->head.next=stack->head.next->next;stack->size--;
}
//返回栈顶元素
linknode* top_linkstack(linkstack* stack)
{return stack->head.next;
}

2、二叉树相关定义与操作

//二叉树相关定义与操作
const int my_true=1;
const int my_false=0;
//定义二叉树节点
class binarynode
{
public:char ch;          //节点数据域binarynode* lchild;  //左孩子binarynode* rchild;  //右孩子
};
//栈中的二叉树节点
class linktree
{
public:linknode node;binarynode* root;int flag;
};
//创建栈中二叉树节点
linktree* creat_linktree_node(binarynode* node,int flag)
{linktree* newnode=new linktree;newnode->root=node;newnode->flag=flag;return newnode;
}
//非递归遍历
void nonrecurision(binarynode* root)
{//创建栈linkstack* stack=init_linkstack();//把根节点放入push_linkstack(stack,(linknode*)creat_linktree_node(root,my_false));while (stack->size>0){//弹出栈顶元素linktree* node=(linktree*)top_linkstack(stack);pop_linkstack(stack);//弹出节点判断是否为空if (node->root==NULL){continue;}if (node->flag==my_true){cout<<node->root->ch<<"\t";}else  //改变压栈顺序即可改变遍历顺序{//当前节点左右子树入栈push_linkstack(stack,(linknode*)creat_linktree_node(node->root->rchild,my_false)); push_linkstack(stack,(linknode*)creat_linktree_node(node->root->lchild,my_false));//当前节点入栈node->flag=my_true;push_linkstack(stack,(linknode*)node);}}cout<<endl;
}

3、二叉树创建与遍历

int main()
{//创建节点binarynode node1={'A',NULL,NULL};binarynode node2={'B',NULL,NULL};binarynode node3={'C',NULL,NULL};binarynode node4={'D',NULL,NULL};binarynode node5={'E',NULL,NULL};binarynode node6={'F',NULL,NULL};binarynode node7={'G',NULL,NULL};binarynode node8={'H',NULL,NULL};//建立节点关系node1.lchild=&node2;node1.rchild=&node6;node2.rchild=&node3;node3.lchild=&node4;node3.rchild=&node5;node6.rchild=&node7;node7.lchild=&node8;//非递归先序遍历cout<<"非递归先序遍历:"<<endl;nonrecurision(&node1);system("pause");return 0;
}

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. 伸缩门遥控器c语言程序,急求求c++编程高手,求50的阶乘,要求结果是精确的整数,打印在屏幕上。...
  2. slim android7 nexus7,【畅玩7.0】加一直升pure nexus 7.0系统简单教程(1106更新)
  3. 【分布计算环境学习笔记】9 Web Service
  4. c在linux中怎样执行文件,如何在Linux中编译和运行C/C+程序,简单示例教懂你
  5. SpringBoot编写HelloWorld-new
  6. Twitch如何实现转码器比FFmepg性能提升65%?(上)
  7. Java并发(十九):final实现原理
  8. RESET MASTER和RESET SLAVE使用场景和说明【转】
  9. [小结]InnoDB体系结构及工作原理
  10. 结构重参数化技术【为了模型压缩】:进可暴力提性能,退可无损做压缩
  11. 二次开发 英文_Revit二次开发——异形柱翻模插件的开发思路
  12. api postmain 鉴权_API授权与验证 - 文档中心 - 快代理
  13. cad字体hztxt用什么代替_为什么CAD的字体库相同但打开图纸的效果却不同?
  14. 都是arm 为什么用java,为什么内存指令在ARM汇编中需要4个周期?
  15. Oracle标准建表语句
  16. 怎么使用svn下载到本地
  17. java 数独算法_[Java] 数独生成和求解
  18. pika详解(二) BlockingConnection
  19. python绘图颜色代码大全_matplotlib指定绘图颜色的八种方式——python篇
  20. 学习andriod开发之 自己开发短信发送软件

热门文章

  1. 室内空气流动原理图_空气流动基本原理
  2. 达梦数据库导出、导入操作
  3. 计算机终端维护组织结构,信息部组织架构及人员编制 Manning GuideOrganization Chart...
  4. gif怎么裁剪尺寸?一键gif裁剪工具推荐
  5. NDK 开发之 Android LOG 工具类
  6. m1芯片xcode打包IPA processing failed错误解决方案
  7. 示教器重定位下机器人动作_ABB机器人示教器入门-初级教学|干货
  8. 2020年下半年软件设计师上午真题及答案解析
  9. 软件设计师考试真题链接
  10. 台式计算机硬盘主要接口,硬盘接口类型,详细教您怎么看硬盘接口的类型