二叉树是一种常见的数据结构,这里我们需要要注意的是,二叉树的非递归的遍历。

先序遍历,中序遍历,后序遍历

这三种遍历,如果用非递归的方式实现,我们则需要借助栈这个结构,首先我们需要遍历所有左子树的左节点。进行压栈,完成压栈之后,根据不同的需求,判断是否该继续访问或者弹出亦或者是压入该节点的右子树。

层序遍历

不同于其他的遍历方式,层序遍历是以根节点为开始,依次向下,每层从左到右依次访问。

这里我们需要借助与队列这种数据结构,层层入队,层层出队,完成遍历。

代码如下:

#pragma once
#include<iostream>
using namespace std;
#include<queue>
#include<stack>
typedef  char DataType;
struct BinaryTreeNode//节点结构体
{BinaryTreeNode(DataType data = (DataType)0):_data(data), _leftChild(NULL), _rightChild(NULL){}DataType _data;BinaryTreeNode* _leftChild;BinaryTreeNode* _rightChild;
};
class BinaryTree
{typedef BinaryTreeNode _NODE;
public:BinaryTree(char* str)//通过先序的字符串构造二插树‘#’为空{_root = _CreatTree(_root,str);}BinaryTree(const BinaryTree &t){_root = _Copy(t._root);}BinaryTree operator =(BinaryTree t){swap(_root, t._root);return *this;}~BinaryTree(){_Destory(_root);}size_t Size()//求二叉树的大小{return _Size(_root);}size_t Depth()//求深度{return _Depth(_root);}void LevelOrder()//层序遍历二叉树{queue<_NODE*> NodeQueue;_NODE* cur = _root;NodeQueue.push(cur);while (!NodeQueue.empty()){_NODE*tmp = NodeQueue.front();//取队头cout << tmp->_data << " ";//访问NodeQueue.pop();if (tmp->_leftChild)//左不为空入左,右不为空入右NodeQueue.push(tmp->_leftChild);if (tmp->_rightChild)NodeQueue.push(tmp->_rightChild);}}void BackOrder_NONREC()//后续非递归遍历{stack<_NODE*> s;_NODE*prev = NULL;_NODE*cur = _root;while (!s.empty()||cur)//压一颗树的左子树,直到最左{while (cur){s.push(cur);cur = cur->_leftChild;}_NODE* top = s.top();if (top->_rightChild==NULL||top->_rightChild==prev)//若栈顶节点的右节点为空,或者是已经访问过的节点,则不弹出栈顶节点{visitor(top);prev = top;//将最后一次访问过得节点保存s.pop();}else//否则压入以栈顶节的右节点点为根的左子树,直到最左{cur = top->_rightChild;}}}void InOrder_NONREC()//中序非递归遍历{stack<_NODE*> s;_NODE*cur = _root;while (!s.empty() || cur){while (cur)//压一棵树的左节点直到最左,若为空则不进行压栈{s.push(cur);cur = cur->_leftChild;}_NODE* top = s.top();if (!s.empty())//访问栈顶节点,将另一颗被压的树,置为栈顶节点的右子树{visitor(top);s.pop();cur = top->_rightChild;}}}void PrevOrder_NONREC()//先序非递归遍历{stack<_NODE*> s;_NODE* cur = NULL;s.push(_root);while (!s.empty()){cur = s.top();//先访问当前节点visitor(cur);s.pop();if (cur->_rightChild)//当前右节点不为空压入s.push(cur->_rightChild);if (cur->_leftChild)s.push(cur->_leftChild);}cout << endl;}
protected:static void visitor(_NODE* cur)//访问函数,为了满足测试,控制台打印数据{cout << cur->_data << " ";}_NODE* _Copy(_NODE* root){_NODE* newRoot = NULL;if (root == NULL)return NULL;else{newRoot = new _NODE(root->_data);newRoot->_leftChild = _Copy(root->_leftChild);newRoot->_rightChild = _Copy(root->_rightChild);}return newRoot;}size_t _Depth(_NODE* root){size_t depth = 0;if (root == NULL)return depth;else{depth = _Depth(root->_leftChild) + 1;size_t newdepth = _Depth(root->_rightChild) + 1;depth = depth > newdepth ? depth : newdepth;}return depth;}size_t _Size(_NODE* root){if (root==NULL)return 0;elsereturn _Size(root->_leftChild) + _Size(root->_rightChild) + 1;}void _Destory(_NODE* &root){if (root){if ((root->_leftChild == NULL)&&(root->_rightChild == NULL)){delete root;root = NULL;}else{_Destory(root->_leftChild);_Destory(root->_rightChild);_Destory(root);}}}_NODE*_CreatTree(_NODE* root,char* &str){_NODE*cur = root;if (*str == '#' ||*str == 0){return NULL;}else{cur = new _NODE(*str);cur->_leftChild = _CreatTree(cur->_leftChild, ++str);cur->_rightChild = _CreatTree(cur->_rightChild,++str);}return cur;}
protected:_NODE* _root;
};

如有不足或疑问希望指正。

本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1766937

【代码】C++实现二叉树基本操作及测试用例相关推荐

  1. C站万字详解二叉树基本操作演示程序(附图)

    文章目录 一.实验环境 二.设计需求分析 三.实际设计思路 四.对象与功能剖析 五.代码实现及算法思路分析 BinaryTree包 [二叉树节点类(TreeNode)] [二叉树类(Tree)] [字 ...

  2. 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...

    后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...

  3. 二叉树基本操作:利用队列实现层序遍历

    利用队列实现层序遍历 关于二叉树其他的基本操作可以看我前几篇文章: 二叉树的基本操作:二叉树的后序遍历非递归算法 二叉树的遍历:前序非递归和中序非递归 二叉树基本操作:二叉树的创建与递归遍历 基础知识 ...

  4. 数据结构 【实验7 二叉树基本操作】

    实验7   二叉树基本操作 实验目的 1.  熟悉二叉树结点的结构和对二叉树的基本操作. 2.  掌握对二叉树每一种操作的具体实现. 3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法 ...

  5. 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验

    实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...

  6. 代码随想录_二叉树_leetcode236

    leetcode 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T ...

  7. 树的基本操作代码 c语言,二叉树的基本操作(C语言、源代码)

    二叉树的基本操作(源代码) #include "stdio.h" #include "malloc.h" #define MAX 100 typedef str ...

  8. 干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作

    作者 | 王天庆,长期从事分布式系统.数据科学与工程.人工智能等方面的研究与开发,在人脸识别方面有丰富的实践经验.现就职某世界100强企业的数据实验室,从事数据科学相关技术领域的预研工作. 来源 |  ...

  9. 一步一图一代码之排序二叉树

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong/) 属性: ①若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值. ②若它的右子树不为空,则右子树上所 ...

最新文章

  1. 【洛谷p1313】计算系数
  2. 30 篇亮点论文、5 大主题带你一览 ECCV 2020研究趋势
  3. (完全解决)Key already registered with the same priority: GroupSpatialSoftmax
  4. 阿里钉钉陈航发布10亿“春雨计划”,推进企业级市场服务创新
  5. 和你谈谈数据分析报告
  6. 卷积核_漫画:卷积神经网络中的卷积核到底是什么?
  7. Linux操作系统使用基础03:Linux文件权限与目录配置
  8. UNIX环境高级编程之第5章:标准I/O库-习题
  9. 数据中心监控软件 - ManageEngine OpManager
  10. GitHub新手使用教学(从安装到使用)
  11. 无法激活服务,因为它不支持 ASP.NET 兼容性
  12. mbp touchbar设置_macbookpro touchbar 怎么添加锁屏快捷键
  13. [matlab]三维画图
  14. 数据可视化-柱状图-dict结构MACARONS主题
  15. wish商户平台登录网址中国版【wish圈】
  16. 2020杭电计算机考研复试面试
  17. Hyper-V 2012 R2 故障转移群集
  18. Mybatis学习-动态SQL
  19. PostgreSQL 14及更高版本改进
  20. MySQL查询字典表

热门文章

  1. 【unity】几个常用脚本
  2. Rethinking Image Aesthetics Assessment:Models,Datasets and Benchmarks
  3. [转]Unsafe at any speed: Memcpy() banished in Redmond
  4. 配流02—DIAL算法(改进)
  5. vue项目中使用swiper 实现无缝滚动
  6. JAVA基础之二维数组三维数组及应用
  7. Error: Can't place multiple pins assigned to pin location……解决办法
  8. Windows 10 配置OpenGL ES 3.0 环境
  9. 如何从实验室菜鸟如何蜕变成实验巨人?
  10. 2006年上市公司A股市值百强榜单