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

    注意:本总结中最终会删除不成功 ,原因是Item.vue中方法methods单词拼写错误!!! 首先明白,删除在Item.vue中交互 1.写交互,首先写监听@click="deleteIt ...

  2. java大附件上传,支持断点续传

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  3. 使用gitstats分析git 仓库代码

    gitstats 是一个很不错的git 代码提交分析工具,可以帮助我们生成图表统计结果 工具文档信息 gitstats http://gitstats.sourceforge.net/ 安装 使用ce ...

  4. CH定理与线性递推

    才发觉自己数学差的要死,而且脑子有点浑浑噩噩的,学了一个晚上才学会 如果说的有什么不对的可以在下面嘲讽曲明 以下无特殊说明时,默认方阵定义在实数域上,用\(|A|\)表示\(A\)的行列式 特征值与特 ...

  5. hhhhh臭不要脸//捂脸)多不好意思啊you进步惹

    如题↑↑↑ 千万不要相信题目 还是看图说话吧↓↓↓ 我真的蒟蒻啊,,,准确率在70边缘徘徊,卑微☹ 不过还是侥幸地进入了前 30 名! 今天七夕欸,然鹅,,, qq空间里面弥漫着恋爱的酸臭味 香气,‘ ...

  6. Java 12 骚操作, switch居然还能这样玩!

    Java 13 都快要来了,12必须跟栈长学起! Java 13 即将发布,新特性必须抢先看! Java 12 中对 switch 的语法更友好了,建议大家看下栈长在Java技术栈微信公众号分享的&l ...

  7. 下载根目录下的pdf文件, 浏览器下载

    public void outPut(HttpServletRequest request, HttpServletResponse response, Integer type) { ClassPa ...

  8. [RoarCTF 2019]simple_uplod

    目录 [RoarCTF 2019]simple_uplod 1.ThinkPHP文件上传 2.upload()多文件上传 ThinkPHP上传文件名暴破 [RoarCTF 2019]simple_up ...

  9. 20189220 余超《Linux内核原理与分析》第五周作业

    扒开系统调用的三层皮?(上) 第4章的基础知识 Linux系统调用的三层机制:xyz()(API函数).system_call(系统调用处理入口) . sys_xyz()(系统调用内核处理函数). 3 ...

  10. [代码质量] 代码质量管控 -- 复杂度检测 (JavaScript)

    转载自: https://juejin.im/post/59bb8b546fb9a00a4247532e 背景 代码的复杂度是评估一个项目的重要标准之一.较低的复杂度既能减少项目的维护成本,又能避免一 ...