简要概述

前序遍历:先输出父节点,再输出左孩子节点,最后输出右孩子节点;

中序遍历:先输出左孩子节点,再输出父节点,最后输出右孩子节点;

后序遍历:先输出左孩子节点,再输出右孩子节点,最后输出父节点;

递归实现

如果对递归的思想还不是很清楚,建议博客入门递归算法入门

#include<iostream>
#include<stack>
using namespace std;struct BinaryTree {int data;BinaryTree *leftchild;BinaryTree *rightchild;BinaryTree(int data):data(data), leftchild(NULL), rightchild(NULL){}
};
BinaryTree *BinaryTree;void InsertNode(BinaryTree *Tree, int data) {if(data <= Tree->data) {if(Tree->leftchild != NULL) {Tree->leftchild = new BinaryTree(data);} else {InsertNode(Tree->leftchild, data);}} else {if(Tree->rightchild != NULL) {Tree->rightchild = new BinaryTree(data);} else {InsertNode(Tree->rightchild, data);}}
}void PreOrder(BinaryTree *Tree) {if(Tree != NULL) {cout<<Tree->data;PreOrder(Tree->leftchild);PreOrder(Tree->rightchild);}
}void InOrder(BinaryTree *Tree) {if(Tree != NULL) {InOrder(Tree->leftchild);cout<<Tree->data;InOrder(Tree->rightchild);}
}void PostOrder(BinaryTree *Tree) {if(Tree != NULL) {PostOrder(Tree->leftchild);PostOrder(Tree->rightchild);cout<<Tree->data;}
}

非递归实现

前序遍历:根节点入栈,在每次循环中,先取出当前栈顶元素并输出,然后压入右孩子节点,再压入左孩子节点,循环至栈空退出;

中序遍历:根节点赋给当前的临时节点,在每次循环中,若当前的临时节点非空,将当前节点压入栈,往左孩子遍历;若当前的临时节点为空,取栈顶元素并输出,将栈顶元素的右孩子节点赋给当前的临时节点,循环至当前节点为空且栈空退出;

后序遍历:反向思考前序遍历,根节点入栈s1,在每次循环中,先取出当前栈s1的栈顶元素,并压入栈s2中,然后将左孩子节点压入栈s1,再将右孩子节点压入栈s1,循环至栈空;最后按序取出栈s2中元素并输出;

//头文件以及使用命名空间,二叉树的数据结构见上,此处省略void preOrder(BinaryTree *Tree) {if(Tree == NULL) {return ;}stack<BinaryTree*> s;s.push(Tree);while(!s.empty()) {BinaryTree *temp = s.top();s.pop();cout<<temp->data;if(temp->rightchild != NULL) {s.push(s->rightchild);} if(temp->leftchild != NULL) {s.push(s->leftchild);}}
}void inOrder(BinaryTree *Tree) {stack<BinaryTree*> s;BinaryTree *temp = Tree;while(temp != NULL || !s.empty()) {if(temp != NULL) {   //当前节点非空,压入栈,继续往左遍历s.push(temp);temp = temp->leftchild;} else {   //当前节点为空,取栈顶元素并输出,将栈顶元素的右孩子节点赋给当前节点BinaryTree *node = s.top();s.pop();cout<<node->data;temp = node->rightchild;}}
}void postOrder(BinaryTree *Tree) {stack<BinaryTree*> s1, s2;s1.push(Tree);while(!s1.empty()) {BinaryTree *temp = s1.top();s1.pop();s2.push(temp);if(temp.leftchild != NULL) {s1.push(temp.leftchild);}if(temp.rightchild != NULL) {s1.push(temp.rightchild);}}while(!s2.empty()) {cout<<s2.top();s2.pop();}
}

深度优先搜索(DFS)

即先序遍历,从根节点开始,先沿着左子树一直遍历,直到叶子节点为止;接着回溯到上一个节点,进行右子树节点的遍历,当所有节点遍历完成之后退出;

广度优先搜索(BFS)

即层次遍历,从根节点开始,对每一层子节点遍历完之后,再开始下一层节点的遍历,当所有节点遍历完成之后推出;

//深度优先遍历
void depthFirstSearch(BinaryTree *Tree) {stack<BinaryTree*> s;s.push(Tree);while(!s.empty()) {BinaryTree *temp = s.top()s.pop()cout<<temp->data;if(s.rightchild != NULL) {s.push(s.rightchild);} if(s.leftchild != NULL) {s.puhs(s.leftchild);}}
}//广度优先遍历
void breadthFirstSearch(BinaryTree *Tree) {queue<BinaryTree*> q;q.push(Tree);while(!q.empty()) {BinaryTree *temp = q.front();q.pop();cout<<temp->data;if(temp.leftchild != NULL) {q.push(temp->leftchild);}if(temp.rightchild != NULL) {q.push(temp->rightchild);}}
}

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

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

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

  2. 二叉树遍历的非递归实现

    作者:冯老师,华清远见嵌入式学院讲师. 一.递归的定义及特点 递归是指某个函数直接或间接的调用自身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出.递归问题的关 ...

  3. java使用btree_java数据结构之二叉树遍历的非递归实现

    算法概述 递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似. ...

  4. 二叉树遍历(非递归)

    文章目录 二叉树遍历非递归版本 前序遍历 中序遍历 后序遍历 层序遍历 层序遍历+map记录高度 二叉树遍历非递归版本 前序遍历 如果右侧不为空,则右侧进栈,随后是左侧进栈.因为栈是先进后出,所以实现 ...

  5. 二叉树遍历(非递归遍历)

    #include <iostream> #include <vector> #include <stack>using namespace std;//思路分析 / ...

  6. 二叉树 2.0 -- 非递归遍历

    二叉树递归遍历存在的问题 如果我们的二叉树只有左子树,而且树的高度还很深的时候,这个时候递归调用遍历的时候,栈帧空间开辟的较大,很可能造成栈溢出.但是我们一个程序中,为堆分配的空间要比栈大的多,这个时 ...

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

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

  8. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  9. 对于二叉树三种非递归遍历方式的理解

    利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...

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

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

最新文章

  1. 精通Server Core系列之一 ---Server Core简介
  2. python request下载-Python使用requests下载文件问题
  3. 如何编写高性能的C#代码(四)字符串的另类骚操作
  4. 小米登录协议分析_小米温湿度传感器协议分析
  5. Hadoop DistCp工具简介及其参数
  6. python可以处理的文件类型_Python学习笔记之数据类型与文件处理
  7. leetcode959. Regions Cut By Slashes
  8. 拓端tecdat|R语言中固定与随机效应Meta分析 - 效率和置信区间覆盖
  9. JAVA中serialVersionUID可以使用hashCode()赋值
  10. 随笔编号-15 重构--改善既有代码的设计--Day01--学习笔记
  11. linux文件被锁定,Linux下锁定系统重要文件,防止篡改
  12. Android Canvas API总结和使用方法
  13. USB-HID鼠标键盘驱动
  14. 华硕主板如何用u盘启动计算机,华硕主板怎么设置u盘启动 华硕主板设置u盘启动方法【图文】...
  15. ILM(Index Lifecycle Management)
  16. 怎么快速做动态图?gif动图在线怎么制作?
  17. 数据库课程设计-----------学生选课管理系统的设计
  18. 软硬件学习记录2——通道速率中比特率bps、Bps、波特率含义及换算
  19. 实验6:shell编程
  20. 线性反馈移位寄存器(LSFR)

热门文章

  1. Autoware1.14-摄像头目标检测YOLO-V3
  2. Docker生态不会重蹈Hadoop的覆辙
  3. 浅谈SVG的两个黑魔法
  4. Dubbo线程池耗尽问题
  5. #Python中创建一个字符串映射表
  6. Linux下删除特殊字符的文件或文件夹
  7. 【转】手机充电器原理
  8. sqlplus之runstats
  9. cookie前端写还是后端写
  10. 为什么说 Ubuntu 22.04 LTS 是史诗级的版本