二叉树的遍历实现,可以用递归的方法也可以用非递归的方法。非递归的方法可以借助栈(前序遍历,中序遍历,后序遍历),也可以借助队列(层次遍历)。本次笔记只使用了递归的方法来进行前序遍历,中序遍历,后序遍历,借助队列进行层次遍历。想要更细致的看一下二叉树的遍历推荐http://c.biancheng.net/data_structure/tree/

要遍历的二叉树如下:

中序遍历:A/B*C-D+E
前序遍历:+-*/ABCDE
后序遍历:AB/C*D-E+
层次遍历:+-E*D/CAB

头文件代码

 #ifndef _BINARYTREE_H
#define _BINARYTREE_H #include<iostream>
#include<queue> template<class T> class BinaryTree; template<class T>
class TreeNode
{
public:
TreeNode()
{
leftChild = NULL;
rightChild = NULL;
}
T data;
TreeNode<T> *leftChild;
TreeNode<T> *rightChild;
}; template<class T>
class BinaryTree
{
public:
//二叉树可以进行的操作
void InOrder();//中序遍历
void InOrder(TreeNode<T>* currentNode); void PreOrder();//前序遍历
void PreOrder(TreeNode<T>* currentNode); void PostOrder();//后续遍历
void PostOrder(TreeNode<T>* currentNode); void LevelOrder();//层次遍历
void Visit(TreeNode<T>* currentNode);
public:
TreeNode<T> *root;//为方便使用将根节点设为公有
}; template<class T>
void BinaryTree<T>::LevelOrder()
{
std::queue<TreeNode<T>*> q;//借用队列,先把每层元素放进队列再进行遍历
TreeNode<T>* currentNode = root;
while (currentNode)
{
Visit(currentNode);
//由于队列先进先出,所以先放左子树,再放右子树
if (currentNode->leftChild) q.push(currentNode->leftChild);
if (currentNode->rightChild) q.push(currentNode->rightChild);
if (q.empty()) return;
currentNode = q.front();
q.pop();//遍历之后要取走接着下一个
}
} template<class T>
void BinaryTree<T>::Visit(TreeNode<T>* currentNode)
{
std::cout << currentNode->data;
} template<class T>
void BinaryTree<T>::InOrder()
{
InOrder(root);
} template<class T>
void BinaryTree<T>::InOrder(TreeNode<T>* currentNode)
{
if (currentNode)
{
InOrder(currentNode->leftChild);
Visit(currentNode);
InOrder(currentNode->rightChild);
}
} template<class T>
void BinaryTree<T>::PreOrder()
{
PreOrder(root);
} template<class T>
void BinaryTree<T>::PreOrder(TreeNode<T>* currentNode)
{
if (currentNode)
{
Visit(currentNode);
PreOrder(currentNode->leftChild);
PreOrder(currentNode->rightChild);
}
} template<class T>
void BinaryTree<T>::PostOrder()
{
PostOrder(root);
} template<class T>
void BinaryTree<T>::PostOrder(TreeNode<T>* currentNode)
{
if (currentNode)
{
PostOrder(currentNode->leftChild);
PostOrder(currentNode->rightChild);
Visit(currentNode);
}
} #endif

源文件代码

 #include<iostream>
#include"binarytree.h" using namespace std; int main()
{
BinaryTree<char> tree;
TreeNode<char> 加, 减, 乘, 除, a, b, c, d, e;
加.data = '+';
减.data = '-';
乘.data = '*';
除.data = '/';
a.data = 'A';
b.data = 'B';
c.data = 'C';
d.data = 'D';
e.data = 'E'; tree.root = &加;
加.leftChild = &减;
加.rightChild = &e;
减.leftChild = &乘;
减.rightChild = &d;
乘.leftChild = &除;
乘.rightChild = &c;
除.leftChild = &a;
除.rightChild = &b; cout << "中序遍历:" ;
tree.InOrder();//中序遍历
cout << endl; cout << "前序遍历:" ;
tree.PreOrder();//前序遍历
cout << endl; cout << "后序遍历:" ;
tree.PostOrder();//后序遍历
cout << endl; cout << "层次遍历:";
tree.LevelOrder();//层次遍历
cout << endl;
return ;
}

数据结构-二叉树的遍历实现笔记C++的更多相关文章

  1. Java数据结构——二叉树的遍历(汇总)

    二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFSNode.java: public class Node { pri ...

  2. 数据结构-二叉树的遍历(类C语言描写叙述)

    遍历概念     所谓遍历(Traversal)是指沿着某条搜索路线.依次对树中每一个结点均做一次且仅做一次訪问.訪问结点所做的操作依赖于详细的应用问题. 遍历是二叉树上最重要的运算之中的一个,是二叉 ...

  3. 数据结构 - 二叉树的遍历(递归VS非递归)

    import java.util.LinkedList; public class BinaryTree { public static void main(String[] args) { int ...

  4. 【PHP数据结构】二叉树的遍历及逻辑操作

    上篇文章我们讲了许多理论方面的知识,虽说很枯燥,但那些都是我们今天学习的前提,一会看代码的时候你就会发现这些理论知识是多么地重要了.首先,我们还是要说明一下,我们学习的主要内容是二叉树,因为二叉树是最 ...

  5. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  6. 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  7. 数据结构与算法之PHP实现二叉树的遍历

    一.二叉树的遍历 以某种特定顺序访问树中所有的节点称为树的遍历,遍历二叉树可分深度优先遍历和广度优先遍历. 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.可以细分 ...

  8. javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

    树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分 ...

  9. Python与数据结构[3] -> 树/Tree[0] -> 二叉树及遍历二叉树的 Python 实现

    二叉树 / Binary Tree 二叉树是树结构的一种,但二叉树的每一个节点都最多只能有两个子节点. Binary Tree: 00 |_____ | | 00 00 |__ |__ | | | | ...

随机推荐

  1. 【批处理】choice命令,call 命令,start 命令,rem

    [1]choice命令简介 使用此命令可以提示用户输入一个选择项,根据用户输入的选择项再决定执行具体的过程. 使用时应该加/c:参数,c: 后应写提示可输入的字符或数字,之间无空格.冒号是可选项. 使 ...

  2. gj的交换机在升级了ios之后最新数据不刷新,

    下午2点开始升级5点结束,之后监控项获取不到最新数据,显示网络接口一直是down的状态,但是登上设备之后显示的是正常up状态, 怀疑是自动发现规则的问题,但是查看之后都是1个小时,应该不会, 这时候诡 ...

  3. 修改git 提交的用户名和用户Email命令

    首页先查看全局配置:git config --list git config --local --list 法一:使用命令修改git的用户名和提交的邮箱 )修改全局 如果你要修改当前全局的用户名和邮箱 ...

  4. vue 把后端返回的图片和url链接生成的二维码用canvas 合成一张图片

    H5 页面在做某个活动的时候,有两种分享方式,一种是链接分享,一种是图片分享. 链接分享的话,如果是在微信里,就可引导用户利用微信浏览器自带的分享,根据sdk设置分享标题简介链接缩略图即可. 图片分享 ...

  5. vue中前端弹窗队列展示

    在前端写一个弹窗可能很简单,那如果同时有多个弹窗呢 这样的话就要考虑弹窗的展示问题,肯定是不能叠加在一起的,这时候就要通过队列(先进先出)来展示 思路就是根据队列来实现,至于具体的实现方式,可以在项目 ...

  6. socket简单实践

    目录 socket模块: family(socket家族) fileno=None 请忽略,特殊用途 socket模块: 把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装 应 ...

  7. 帝国cms7.5整合百度编辑器ueditor教程

    1.根据自己使用的帝国cms版本编码下载对应的ueditor版本 下载地址 http://ueditor.baidu.com/website/download.html#ueditor 2.解压附件, ...

  8. [RoarCTF 2019]Online Proxy

    目录 [RoarCTF 2019]Online Proxy [RoarCTF 2019]Online Proxy 题目复现链接:https://buuoj.cn/challenges 参考链接:官方w ...

  9. #C++初学记录(STL容器以及迭代器)

    STL初步 提交ACM会TLE /仅以学习STL与迭代器使用 C. Cards Sorting time limit per test1 second memory limit per test256 ...

  10. Servlet快速入门及运行流程

    一.Servlet快速入门 1.创建一个web工程 2.在JavaResource中src下创建一个包名称为com.myxq.servlet 3.在创建的servlet包当中创建一个class文件起名 ...