前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁;辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它的缺点是什么呢?缺点就是效率低。对于一个算法来说,其中最重要的一个点就是效率,如果一个算法效率低下,辣么它被使用的概率就很低,因为我们每时每刻都在追求最优解~

对于二叉树的非递归遍历我们可以借助栈来实现,下面我们给出先序遍历和中序遍历非递归算法的其中一种:

//
// Created by Administrator on 2018/6/5.
//
/*** 二叉树的非递归遍历:先序遍历、中序遍历*/
#include "stdio.h"
#include "stdlib.h"/*** 定义一棵树*/
typedef struct {char data;struct BitTreeNode *lchild, *rchild;
} BitTreeNode, *BitTree;/*** 定义一个栈*/
#define MaxSize 100
typedef struct {BitTree data[MaxSize];//数据域,树节点指针int top;//下标索引int currentSize;//栈当前大小
} Stack2;/*** 初始化栈* @param stack2*/
void initStack2(Stack2 *stack2) {stack2->top = -1;stack2->currentSize = 0;
}/*** 入栈操作* @param stack2* @param node*/
void push2(Stack2 *stack2, BitTree node) {if (stack2->currentSize == MaxSize) {//栈已满printf("很遗憾告诉你:栈已满~\n");return;}stack2->top++;stack2->data[stack2->top] = node;stack2->currentSize++;
}/*** 出栈操作* @param stack2* @return*/
BitTree pop2(Stack2 *stack2) {if (stack2->currentSize == 0) {printf("很遗憾告诉你:栈已空~\n");return NULL;}BitTree node = stack2->data[stack2->top];stack2->top--;stack2->currentSize--;return node;
}/*** 前序法创建树* @param tree* @return*/
BitTree createTree(BitTree tree) {char c;scanf("%c", &c);if (c == '#') {return NULL;} else {tree = (BitTree) malloc(sizeof(BitTreeNode));tree->data = c;tree->lchild = createTree(tree->lchild);tree->rchild = createTree(tree->rchild);}return tree;
}/*** 前序法遍历树* @param tree* @param s*/
void preOrder2(BitTree tree, Stack2 *s) {if (tree) {printf("%c", tree->data);preOrder2(tree->lchild, s);preOrder2(tree->rchild, s);}
}void visit(int data) {printf("%c", data);
}/***中序遍历非递归算法* @param tree* @param s*/
void inOrderNoRec(BitTree tree, Stack2 *s) {BitTree p = tree;while (p || s->currentSize > 0) {if (p) {push2(s, p);p = p->lchild;} else {p = pop2(s);visit(p->data);p = p->rchild;}}
}/*** 先序非递归遍历* @param tree* @param s*/
void preOrderNoRec(BitTree tree, Stack2 *s) {BitTree p = tree;while (p || s->currentSize > 0) {if (p) {push2(s, p);visit(p->data);p = p->lchild;} else {p = pop2(s);p = p->rchild;}}
}int main() {Stack2 stack2;initStack2(&stack2);BitTree tree;tree = createTree(tree);printf("前序递归遍历结果:\n");preOrder2(tree, &stack2);printf("\n先序非递归遍历结果:\n");preOrderNoRec(tree, &stack2);printf("\n中序非递归遍历结果:\n");inOrderNoRec(tree, &stack2);
}

数据结构-二叉树的非递归遍历相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 计划任务中allow和deny的优先级
  2. 生成式模型和判别式模型(转)
  3. oracle数据库物理结构包含,Oracle - 数据库物理结构
  4. python爬虫知乎图片_python爬虫(爬取知乎答案图片)
  5. 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
  6. SoapUI 入门指南
  7. 网线分类及如何选择?
  8. 在线视频移动化迁徙加速,UGC待开发
  9. redmine backlogs的tracker使用
  10. Python计算经济距离权重矩阵
  11. Halcon实例分析——check_blister.hdev
  12. 电脑无法显示移动硬盘文件内容的解决方法
  13. OMCI协议二层功能的模型选择
  14. NL80211使用笔记
  15. 在python中strip_Python中关于strip使用方法的小妙招
  16. 腾讯云轻量级服务器宝塔快速部署网站
  17. Sers微服务快速入门-00.目录
  18. VirtualBox 导入centos8 voa镜像无GNOME GUI界面问题解决
  19. CAN 协议控制器和物理总线之间的接口芯片SIT1040T 高速 CAN 总线收发器
  20. Linux citra存档位置,citra 3ds模拟器怎样保存游戏进度_citra 3ds模拟器游戏进度保存方法教程-街机中国...

热门文章

  1. idea使用svn拉取项目代码_IntelliJ IDEA 14 拉取SVN maven 多模块项目 部署tomcat 详细图解!...
  2. mysql在linux下的安装_mysql在linux下的安装
  3. pdf转换为word小工具,挺好
  4. Lync Server 2013企业版部署系列之九:前端部署后续工作
  5. 网页制作技术革新:《HTML5 网站大观》系列文章导航
  6. 转:J2SE5中的最新注释功能SuppressWarnings
  7. IP网络设计系列之-局域网设计
  8. 基于角色的权限管理数据库设计(RBAC)
  9. linux命令去除重复的值,学习linux的Split 命令-linux下去除重复的命令uniq用法...-linux下join与paste命令的用法_169IT.COM...
  10. python最新面试题_2018年最新Python面试题及答案