二叉树的遍历有递归与非递归两种方式,但思想大致相同

前序:先打印然后遍历完他的左子树,左子树为空时开始返回,并且开始以栈中元素为根遍历右子树

中序:先遍历左子树然后左子树入栈,左子树为空再打印,再遍历右子树

后序:先遍历完左子树,左子树入栈保存,再遍历右子树,遍历完打印,否则继续入栈

递归遍历

//递归遍历
//遍历树
//前序
void PreOder1(Tree *root)
{if (root == NULL){printf("# ");return;}printf("%c ", root->data);PreOder1(root->leftchild);PreOder1(root->rightchild);
}
//中序
void PreOder2(Tree *root)
{if (root == NULL){printf("# ");return;}PreOder2(root->leftchild);printf("%c ", root->data);PreOder2(root->rightchild);
}
//后序
void PreOder3(Tree *root)
{if (root == NULL){ printf("# ");return;}PreOder3(root->leftchild);PreOder3(root->rightchild);printf("%c ", root->data);
}

非递归遍历

需要手动创建一个栈结构,然后进行,遍历入栈等操作

//非递归 前序遍历
void frountTree(Tree *root)
{Tree *pCur=root;Tree *pTop=NULL;Stact TreeStack;InitStack(&TreeStack);while (!Empy(&TreeStack)||pCur!=NULL){while (pCur != NULL){printf("%c ", pCur->data);Push(&TreeStack, pCur);pCur = pCur->leftchild;}pTop = Pop(&TreeStack);pCur = pTop->rightchild;}
}
//中序
//栈顶元素为根,如果他不为空就入栈,他为空说明他的上一个节点没有左子,打印,然后出栈看他的右子
void midTree(Tree*root)
{Tree* pCur = root;Tree* pTop = NULL;Stact TreeStack;InitStack(&TreeStack);while (!Empy(&TreeStack) || pCur != NULL){while (pCur!= NULL){Push(&TreeStack, pCur);pCur = pCur->leftchild;}pTop = StackTop(&TreeStack);printf("%c ", pTop->data);pCur = pTop->rightchild;Pop(&TreeStack);}
}
//后序
void backTree(Tree*root)
{Tree* pCur = root;Tree* pTop = NULL;Tree* pLast = NULL;//这个节点的右子树已经被访问过了Stact TreeStack;InitStack(&TreeStack);while (!Empy(&TreeStack) || pCur != NULL){while (pCur != NULL){Push(&TreeStack, pCur);pCur = pCur->leftchild;}pTop = StackTop(&TreeStack);if (pTop->rightchild == NULL || pTop->rightchild == pLast) //pTop有右子树,但是已经被遍历过了/{//出栈打印Pop(&TreeStack);printf("%c ", pTop->data);//pLast = StackTop(&TreeStack);pLast = pTop;//打印过pTop说明已经遍历过,所以pLast=pTop,下一次pTop再出栈,如果pTop的右子树为pLast说明他被遍历过了continue;}pCur = pTop->rightchild;}
}

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

  1. 漫谈二叉树遍历(非递归)

    ------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...

  2. 4.二叉树的先序、中序以及后序遍历的递归写法与非递归写法(LeetCode第94、144、145题)

    一.递归法 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是"一看就会,一写就废". 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都 ...

  3. 遍历二叉树的各种操作(非递归遍历)

    先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序.中序.后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组 ...

  4. 二叉树路径应用举例(基于非递归后序遍历)

    #include "stdafx.h" #include <iostream> #include <fstream>using namespace std; ...

  5. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  6. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...

    树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...

  7. 二叉树前序、中序和后序遍历的非递归实现

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

  8. 二叉树先中后序递归遍历与非递归遍历、层次遍历

    文章目录 1 先序遍历 1.1 先序遍历递归 1.2 先序遍历非递归 2 中序遍历 2.1 中序遍历递归 2.2 中序遍历非递归 3 后序遍历 3.1 后序遍历递归 3.2 后序遍历非递归 4 层序遍 ...

  9. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

  10. 二叉树的遍历(非递归)整理

    二叉树的遍历(非递归) 写在前面 二叉树重要,重要,重要.以下代码每日手撸一遍,深刻理解. 二叉树的先序遍历(非递归) 巧记心法 判断是否为空树 1.右侧入栈(访问,q指向右孩子,不空则入栈) 2.p ...

最新文章

  1. 整理了一下SQL Server里面可能经常会用到的日期格式转换方法
  2. 面向对象一类与对象的概念与特性
  3. 2021年春季学期-信号与系统-第六次作业参考答案-第八小题
  4. 函数中{}输出格式详解(C#)
  5. 30个创意出色的非常实用的jquery框架插件-(视觉大背景,瀑布流效果)
  6. jenkins 流水线(pipline)
  7. 直播报名 | 超低延时直播架构解析
  8. nvidia-smi:Failed to initialize NVML: Driver/library version mismatch
  9. opencv进阶学习笔记14:分水岭算法 实现图像分割
  10. 冯诺依曼计算机的组成
  11. UVa 1153 Keep the Customer Satisfied 【贪心 优先队列】
  12. VB.NET水晶报表控件经验总结
  13. 双硬盘安装win10和linux双系统,双硬盘安装 Win 10 和 Ubuntu 16.04 双系统
  14. 人生的意义,在于不断地超越自己
  15. CPU工作方式、多核心、超线程技术详解[转贴]
  16. django相关报错知识整理
  17. b temia 外骨骼机器人_纬创医学与加拿大B-Temia公司合作推出下肢外骨骼机器人...
  18. AltiumDesigner PCB设计规则中英文对照及说明
  19. android 文件管理器下载,ES文件管理器下载
  20. mysql_slow_详解MySQL中SlowLog的配置方法(图文)

热门文章

  1. 电商项目实战第六节: CSS3+HTML5+JS 设计案例【考拉海购网站】之【页底信息,网站备案信息】
  2. java实现excel表格导入数据库表
  3. 数控车计算机软件编程的重要性,数控车床程序数控机床的编程方法和典型实例分析...
  4. watch、computed、methods的区别
  5. s6 edge编译android,三星为Galaxy S6和S6 Edge升级Android 6.0.1
  6. 给入行新人的一点忠告
  7. Java Thread.sleep的InterruptedException 线程阻塞 线程中断
  8. JSP+sql网络远程作业处理系统(系统+论文+开题报告+中英文摘要+封面+目录+资料)
  9. 如何用项目管理软件管理项目进度
  10. 判断素数的方法(全部方法)