【代码】C++实现二叉树基本操作及测试用例
二叉树是一种常见的数据结构,这里我们需要要注意的是,二叉树的非递归的遍历。
先序遍历,中序遍历,后序遍历
这三种遍历,如果用非递归的方式实现,我们则需要借助栈这个结构,首先我们需要遍历所有左子树的左节点。进行压栈,完成压栈之后,根据不同的需求,判断是否该继续访问或者弹出亦或者是压入该节点的右子树。
层序遍历
不同于其他的遍历方式,层序遍历是以根节点为开始,依次向下,每层从左到右依次访问。
这里我们需要借助与队列这种数据结构,层层入队,层层出队,完成遍历。
代码如下:
#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++实现二叉树基本操作及测试用例相关推荐
- C站万字详解二叉树基本操作演示程序(附图)
文章目录 一.实验环境 二.设计需求分析 三.实际设计思路 四.对象与功能剖析 五.代码实现及算法思路分析 BinaryTree包 [二叉树节点类(TreeNode)] [二叉树类(Tree)] [字 ...
- 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...
后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...
- 二叉树基本操作:利用队列实现层序遍历
利用队列实现层序遍历 关于二叉树其他的基本操作可以看我前几篇文章: 二叉树的基本操作:二叉树的后序遍历非递归算法 二叉树的遍历:前序非递归和中序非递归 二叉树基本操作:二叉树的创建与递归遍历 基础知识 ...
- 数据结构 【实验7 二叉树基本操作】
实验7 二叉树基本操作 实验目的 1. 熟悉二叉树结点的结构和对二叉树的基本操作. 2. 掌握对二叉树每一种操作的具体实现. 3. 学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法 ...
- 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验
实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...
- 代码随想录_二叉树_leetcode236
leetcode 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T ...
- 树的基本操作代码 c语言,二叉树的基本操作(C语言、源代码)
二叉树的基本操作(源代码) #include "stdio.h" #include "malloc.h" #define MAX 100 typedef str ...
- 干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作
作者 | 王天庆,长期从事分布式系统.数据科学与工程.人工智能等方面的研究与开发,在人脸识别方面有丰富的实践经验.现就职某世界100强企业的数据实验室,从事数据科学相关技术领域的预研工作. 来源 | ...
- 一步一图一代码之排序二叉树
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong/) 属性: ①若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值. ②若它的右子树不为空,则右子树上所 ...
最新文章
- 【洛谷p1313】计算系数
- 30 篇亮点论文、5 大主题带你一览 ECCV 2020研究趋势
- (完全解决)Key already registered with the same priority: GroupSpatialSoftmax
- 阿里钉钉陈航发布10亿“春雨计划”,推进企业级市场服务创新
- 和你谈谈数据分析报告
- 卷积核_漫画:卷积神经网络中的卷积核到底是什么?
- Linux操作系统使用基础03:Linux文件权限与目录配置
- UNIX环境高级编程之第5章:标准I/O库-习题
- 数据中心监控软件 - ManageEngine OpManager
- GitHub新手使用教学(从安装到使用)
- 无法激活服务,因为它不支持 ASP.NET 兼容性
- mbp touchbar设置_macbookpro touchbar 怎么添加锁屏快捷键
- [matlab]三维画图
- 数据可视化-柱状图-dict结构MACARONS主题
- wish商户平台登录网址中国版【wish圈】
- 2020杭电计算机考研复试面试
- Hyper-V 2012 R2 故障转移群集
- Mybatis学习-动态SQL
- PostgreSQL 14及更高版本改进
- MySQL查询字典表
热门文章
- 【unity】几个常用脚本
- Rethinking Image Aesthetics Assessment:Models,Datasets and Benchmarks
- [转]Unsafe at any speed: Memcpy() banished in Redmond
- 配流02—DIAL算法(改进)
- vue项目中使用swiper 实现无缝滚动
- JAVA基础之二维数组三维数组及应用
- Error: Can't place multiple pins assigned to pin location……解决办法
- Windows 10 配置OpenGL ES 3.0 环境
- 如何从实验室菜鸟如何蜕变成实验巨人?
- 2006年上市公司A股市值百强榜单