二叉树的遍历实现,可以用递归的方法也可以用非递归的方法。非递归的方法可以借助栈(前序遍历,中序遍历,后序遍历),也可以借助队列(层次遍历)。本次笔记只使用了递归的方法来进行前序遍历,中序遍历,后序遍历,借助队列进行层次遍历。想要更细致的看一下二叉树的遍历推荐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. Oracle iops测试

    DECLARE  lat  INTEGER;  iops INTEGER;  mbps INTEGER;BEGIN  DBMS_RESOURCE_MANAGER.CALIBRATE_IO(4, 10, ...

  2. 缺陷的优先程度(Priority)

    测试人员希望程序员什么时间哪个版本修改该bug (1)Urgent 立即修改否则影响开发进度 (2)Veryhigh 本版本修改 (3)High 下个版本修改 (4)Medium 发布前修改 (5)L ...

  3. OpenFOAM——圆腔顶盖旋转驱流

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL008: Flow Inside a Rotating Cavity 腔体顶盖以1 ...

  4. 微信小程序之页面导航栏

    效果图: 页面有点丑,作为初次学习,页面可以要求不那么美观,先学会再说.毕竟后面可以优化的很漂亮. 代码实例如下: <view class="section btn-area" ...

  5. 刷题记录:[FBCTF2019]Products Manager

    目录 刷题记录:[FBCTF2019]Products Manager 一.知识点 1.基于约束的SQL注入攻击 刷题记录:[FBCTF2019]Products Manager 题目复现链接:htt ...

  6. SSM项目实战 之 Shiro

    目录 Shiro 概述 shiro核心概念 核心类 整体类图 主要概念 Shiro架构 认证 什么是认证 关键对象 使用ini完成认证 认证流程 自定义realm 散列密码 授权 什么是授权 使用in ...

  7. Qt中文编码和QString类Unicode编码转换

      版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/g423tgl234/article ...

  8. DELPHI7 ADO二层升三层新增LINUX服务器方案

    DELPHI7 ADO二层升三层新增LINUX服务器方案 引子:笔者曾经无数次在用户的LINUX服务器上创建一个WINDOWS虚拟机,用于运行自己DELPHI开发中间件. 现在再不需要如此麻烦了. 咏 ...

  9. Java线程同步的Monitor机制(Lock配合Condition)

    Monitor模式是一种常见的并行开发机制, 一个Monitor实例可以被多个线程安全使用, 所有的monitor下面的方法在运行时是互斥的, 这种互斥机制机制可以用于一些特性, 例如让线程等待某种条 ...

  10. 已知X,Y独立,那么X^2与Y也独立

    考虑离散情况,  P{X^2=k} => P{X=sqrt(k)} 由X,Y独立可知, P{X=Sqrt(k}  | Y=y} =P{X=Sqrt(x)}, P{X^2=k | Y=y} =P{ ...