前言

数据结构实验作业--用二叉链表实现二叉树(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++)相关推荐

  1. 数据结构 -- 二叉树

          这篇文章介绍的是经典的数据结构--二叉树,在这篇文章里介绍了几乎二叉树的所有操作.       二叉树给我们最重要的印象莫过于递归,因为这棵树就是递归的,所以,我在解决各个问题时大部分都用 ...

  2. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  3. 数据结构——二叉树的递归算法

    二叉树的结构定义: typedef struct BiNode {TElemType data;struct BiNode *lchild;struct BiNode *rchild; }BiNode ...

  4. 数据结构——二叉树的层次遍历进阶

    之前的一个博客 数据结构--二叉树的层次遍历看完这个,可以简单实现下面的问题 问题: 1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值. 2.用按层次顺序遍历二叉树的方法, ...

  5. 数据结构----二叉树叶子结点到根节点的高度计算

    数据结构----二叉树叶子结点到根节点的高度计算 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...

  6. 数据结构 二叉树的存储结构_线程二叉树| 数据结构

    数据结构 二叉树的存储结构 线程二叉树 (Threaded Binary Tree ) A binary tree can be represented by using array represen ...

  7. 二叉树----数据结构:二叉树的三种遍历及习题

    二叉树----数据结构:二叉树的三种遍历,利用递归算法. 关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值.删除.查找.求二叉树的深度等等. 有递归和非递归两种算法 ...

  8. 数据结构-二叉树入门Go语言实现

    数据结构-二叉树入门Go语言实现 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构--"树",考虑它的各种特性,来 ...

  9. 数据结构——二叉树——特点及性质

    数据结构--二叉树--特点及性质 二叉树(Binary Tree)是n(n=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树的二 ...

  10. 数据结构——二叉树总结

    数据结构-二叉树总结 写在前面 二叉树遍历 递归实现先.中.后序遍历 非递归遍历 先序非递归 中序非递归 后序非递归 层次遍历 二叉树还原 先序中序建树 后序中序建树 层次中序建树 二叉树应用 二叉查 ...

最新文章

  1. android 8.0 intent,Android 8.0通知栏适配问题
  2. javaScript知识点大全
  3. Informatica ETL workflow 定时运行功能介绍 scheduler
  4. VTK:vtkCellCenters用法实战
  5. (6)SMC接口采集数据出现错误(学无止境)
  6. 软工导论测试代码(归档):设备管理系统
  7. Python-Telnet连接工具类
  8. IDEA 各版本下载地址
  9. JEECG代码生成器(GUI)的使用
  10. Pycharm生成.exe文件
  11. 如何制作家庭网络服务器,如何用一个废旧的笔记本打造一个家庭网络服务器?...
  12. Fractional step and sor multigrid conjugate gradient method
  13. 整数平方一定大于零吗?
  14. 从董明珠雷军世纪之赌中看到什么样的格力和小米?
  15. Z-score 和 标准正态分布的关系
  16. 基于MTK65xx平台lcm和背光驱动的编写
  17. Openstack-T 之Neutron
  18. css透明到渐变,css渐变(css3背景透明渐变)
  19. Qt编写可视化大屏电子看板系统7-窗体浮动
  20. 数据分析 第三讲 matplotlib常用统计图

热门文章

  1. c语言孙力课后作业答案,课后作业答案
  2. 简单好用的免费内网穿透工具
  3. 【神经网络与深度学习-TensorFlow实践】-中国大学MOOC课程(八)(TensorFlow基础))
  4. java 接口,接口的特性,接口实现多态,面向接口编程
  5. 知名IT企业面试题整理(八)--合并
  6. pap认证失败_认证方式pap chap协议解读
  7. 苹果cms模板_苹果cms怎么修改网站logo?
  8. DAY2作业-假如生活欺骗了你!
  9. Zabbix之SNMP部署心得
  10. 基于Linux RHEL 5 5 安装Oracle 10g RAC