数据结构--二叉树的实现(C++)
前言
数据结构实验作业--用二叉链表实现二叉树(c++版)
包括二叉树的构建、二叉树的销毁,前序遍历、中序遍历、后序遍历、层序遍历等基本操作。
还有求二叉树的叶子结点个数,二叉树的深度、结点个数等。
提示:以下是本篇文章正文内容,下面案例可供参考
1.二叉树的结点定义:
template<typename Datatype>
struct BiNode {Datatype data;BiNode<Datatype> *lchild, *rchild;
};
2.二叉链表类定义:
template<typename Datatype>
class BiTree {
public :BiTree() { root = Creat(); }//构造函数,构造一颗二叉树~BiTree() { Release(root); }//析构函数,释放各结点的存储空间void PreOrder() { PreOrder(root); }//前序遍历void InOrder() { InOrder(root); }//中序遍历void PostOrder() { PostOrder(root); }//后序遍历void LevelOrder();//层序遍历int NodeNum() { return NodeNum(root); }//二叉树的结点总个数int TreeDepth() { return TreeDepth(root); }//二叉树的深度void LeafNode() { LeafNode(root); }//二叉树叶子结点数量
private:BiNode<Datatype>* Creat();//构造函数调用void Release(BiNode<Datatype>* bt);//析构函数调用void PreOrder(BiNode<Datatype>* bt);//前序遍历函数调用void PostOrder(BiNode<Datatype>* bt);//后序遍历函数调用void InOrder(BiNode<Datatype>* bt);//中序遍历函数调用int NodeNum(BiNode<Datatype>* bt);//结点个数函数调用int TreeDepth(BiNode<Datatype>* bt);//树深度函数调用void LeafNode(BiNode<Datatype>* bt);//叶子结点函数调用BiNode<Datatype>* root;//指向根结点的头指针
};
3.基本操作的实现
构造函数
template<typename Datatype>
BiNode<Datatype>* BiTree<Datatype>::Creat() {BiNode<Datatype>* bt;char ch;cin >> ch;if (ch == '#') {bt = nullptr;}else {bt = new BiNode<Datatype>;//生成一个头结点bt->data = ch;bt->lchild = Creat();//递归建立左子树bt->rchild = Creat();//递归建立右子树}return bt;
}
析构函数
template<typename Datatype>
void BiTree<Datatype>::Release(BiNode<Datatype>* bt) {if (bt == nullptr) {return;}else {Release(bt->lchild);//释放左子树Release(bt->rchild);//释放右子树delete bt;}
}
前序遍历
template<typename Datatype>
void BiTree<Datatype>::PreOrder(BiNode<Datatype>* bt) {if (bt == nullptr) return;//递归调用结束条件else {cout << bt->data << '\t';//访问根结点数据域PreOrder(bt->lchild);//前序递归遍历bt左子树PreOrder(bt->rchild);//前序递归遍历bt右子树}
}
中序遍历
template<typename Datatype>
void BiTree<Datatype>::InOrder(BiNode<Datatype>* bt) {if (bt == nullptr) return;else {InOrder(bt->lchild);cout << bt -> data << '\t';InOrder(bt->rchild);}
}
后序遍历
template<typename Datatype>
void BiTree<Datatype>::PostOrder(BiNode<Datatype>* bt) {if (bt == nullptr) return;else {PostOrder(bt->lchild);PostOrder(bt->rchild);cout << bt->data << '\t';}
}
层序遍历
template<typename Datatype>
void BiTree<Datatype>::LevelOrder() {BiNode<Datatype>* Q[100], * q = nullptr;int front = -1, rear = -1;//队列初始化if (root == nullptr) {//二叉树为空,算法结束return;}Q[++rear] = root;//根指针入队while (front != rear) {//当队列非空q = Q[++front];//出队cout << q->data << "\t";if (q->lchild != nullptr) Q[++rear] = q->lchild;if (q->rchild != nullptr) Q[++rear] = q->rchild;}
}
结点个数
template<typename Datatype>
int BiTree<Datatype>::NodeNum(BiNode<Datatype> *bt) {//递归遍历所有结点 如果不是空结点的话,递归返回值加1if (bt == nullptr) return 0;else {return NodeNum(bt->lchild) + NodeNum(bt->rchild) + 1;}
}
二叉树的深度
template<typename Datatype>
int BiTree<Datatype>::TreeDepth(BiNode<Datatype>* bt) {//每个节点都有自己的左右子树,每次返回当前节点左右子树长度大的那个//如果根节点为空,则深度为0,返回0,递归出口//否则深度至少为1,然后累加他们左右子树的深度int ldepth = 1, rdepth = 1;if (bt == nullptr) return 0;else {ldepth += TreeDepth(bt->lchild);rdepth += TreeDepth(bt->rchild);}return ((ldepth > rdepth) ? ldepth : rdepth);
}
叶子结点
template<typename Datatype>
void BiTree<Datatype>::LeafNode(BiNode<Datatype>* bt) {//找到叶子结点返回值加1,返回值计数,//2种情况//1.节点为空 返回0,递归出去//2.每当到达叶子结点,返回1,递归给上一层函数if (bt != nullptr) {if (bt->lchild == 0 && bt->rchild == 0) {cout << bt->data;}LeafNode(bt->lchild);LeafNode(bt->rchild);}
}
具体使用
int main() {BiTree<char> T{};cout << "该二叉树的前序遍历序列是:";T.PreOrder();cout << "\n该二叉树的中序遍历序列是:";T.InOrder();cout << "\n该二叉树的后序遍历序列是:";T.PostOrder();cout << "\n该二叉树的层序遍历序列是:";T.LevelOrder();cout << "\n该二叉树的结点个数为:"<<T.NodeNum();;cout << "\n该二叉树的深度为:" <<T.TreeDepth();cout << "\n该二叉树叶子结点是:";T.LeafNode();return 0;
}
注意:输入的格式
运行结果:
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
数据结构--二叉树的实现(C++)相关推荐
- 数据结构 -- 二叉树
这篇文章介绍的是经典的数据结构--二叉树,在这篇文章里介绍了几乎二叉树的所有操作. 二叉树给我们最重要的印象莫过于递归,因为这棵树就是递归的,所以,我在解决各个问题时大部分都用 ...
- 数据结构 - 二叉树 - 面试中常见的二叉树算法题
数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...
- 数据结构——二叉树的递归算法
二叉树的结构定义: typedef struct BiNode {TElemType data;struct BiNode *lchild;struct BiNode *rchild; }BiNode ...
- 数据结构——二叉树的层次遍历进阶
之前的一个博客 数据结构--二叉树的层次遍历看完这个,可以简单实现下面的问题 问题: 1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值. 2.用按层次顺序遍历二叉树的方法, ...
- 数据结构----二叉树叶子结点到根节点的高度计算
数据结构----二叉树叶子结点到根节点的高度计算 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...
- 数据结构 二叉树的存储结构_线程二叉树| 数据结构
数据结构 二叉树的存储结构 线程二叉树 (Threaded Binary Tree ) A binary tree can be represented by using array represen ...
- 二叉树----数据结构:二叉树的三种遍历及习题
二叉树----数据结构:二叉树的三种遍历,利用递归算法. 关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值.删除.查找.求二叉树的深度等等. 有递归和非递归两种算法 ...
- 数据结构-二叉树入门Go语言实现
数据结构-二叉树入门Go语言实现 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构--"树",考虑它的各种特性,来 ...
- 数据结构——二叉树——特点及性质
数据结构--二叉树--特点及性质 二叉树(Binary Tree)是n(n=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树的二 ...
- 数据结构——二叉树总结
数据结构-二叉树总结 写在前面 二叉树遍历 递归实现先.中.后序遍历 非递归遍历 先序非递归 中序非递归 后序非递归 层次遍历 二叉树还原 先序中序建树 后序中序建树 层次中序建树 二叉树应用 二叉查 ...
最新文章
- android 8.0 intent,Android 8.0通知栏适配问题
- javaScript知识点大全
- Informatica ETL workflow 定时运行功能介绍 scheduler
- VTK:vtkCellCenters用法实战
- (6)SMC接口采集数据出现错误(学无止境)
- 软工导论测试代码(归档):设备管理系统
- Python-Telnet连接工具类
- IDEA 各版本下载地址
- JEECG代码生成器(GUI)的使用
- Pycharm生成.exe文件
- 如何制作家庭网络服务器,如何用一个废旧的笔记本打造一个家庭网络服务器?...
- Fractional step and sor multigrid conjugate gradient method
- 整数平方一定大于零吗?
- 从董明珠雷军世纪之赌中看到什么样的格力和小米?
- Z-score 和 标准正态分布的关系
- 基于MTK65xx平台lcm和背光驱动的编写
- Openstack-T 之Neutron
- css透明到渐变,css渐变(css3背景透明渐变)
- Qt编写可视化大屏电子看板系统7-窗体浮动
- 数据分析 第三讲 matplotlib常用统计图