当前位置:   article > 正文

数据结构--二叉树的实现(C++)_c++建立二叉链表树

c++建立二叉链表树

前言

数据结构实验作业--用二叉链表实现二叉树(c++版)

包括二叉树的构建、二叉树的销毁,前序遍历、中序遍历、后序遍历、层序遍历等基本操作。

还有求二叉树的叶子结点个数,二叉树的深度、结点个数等。


提示:以下是本篇文章正文内容,下面案例可供参考

1.二叉树的结点定义:

  1. template<typename Datatype>
  2. struct BiNode {
  3. Datatype data;
  4. BiNode<Datatype> *lchild, *rchild;
  5. };

2.二叉链表类定义:

  1. template<typename Datatype>
  2. class BiTree {
  3. public :
  4. BiTree() { root = Creat(); }//构造函数,构造一颗二叉树
  5. ~BiTree() { Release(root); }//析构函数,释放各结点的存储空间
  6. void PreOrder() { PreOrder(root); }//前序遍历
  7. void InOrder() { InOrder(root); }//中序遍历
  8. void PostOrder() { PostOrder(root); }//后序遍历
  9. void LevelOrder();//层序遍历
  10. int NodeNum() { return NodeNum(root); }//二叉树的结点总个数
  11. int TreeDepth() { return TreeDepth(root); }//二叉树的深度
  12. void LeafNode() { LeafNode(root); }//二叉树叶子结点数量
  13. private:
  14. BiNode<Datatype>* Creat();//构造函数调用
  15. void Release(BiNode<Datatype>* bt);//析构函数调用
  16. void PreOrder(BiNode<Datatype>* bt);//前序遍历函数调用
  17. void PostOrder(BiNode<Datatype>* bt);//后序遍历函数调用
  18. void InOrder(BiNode<Datatype>* bt);//中序遍历函数调用
  19. int NodeNum(BiNode<Datatype>* bt);//结点个数函数调用
  20. int TreeDepth(BiNode<Datatype>* bt);//树深度函数调用
  21. void LeafNode(BiNode<Datatype>* bt);//叶子结点函数调用
  22. BiNode<Datatype>* root;//指向根结点的头指针
  23. };

3.基本操作的实现

构造函数

  1. template<typename Datatype>
  2. BiNode<Datatype>* BiTree<Datatype>::Creat() {
  3. BiNode<Datatype>* bt;
  4. char ch;
  5. cin >> ch;
  6. if (ch == '#') {
  7. bt = nullptr;
  8. }
  9. else {
  10. bt = new BiNode<Datatype>;//生成一个头结点
  11. bt->data = ch;
  12. bt->lchild = Creat();//递归建立左子树
  13. bt->rchild = Creat();//递归建立右子树
  14. }
  15. return bt;
  16. }

析构函数

  1. template<typename Datatype>
  2. void BiTree<Datatype>::Release(BiNode<Datatype>* bt) {
  3. if (bt == nullptr) {
  4. return;
  5. }
  6. else {
  7. Release(bt->lchild);//释放左子树
  8. Release(bt->rchild);//释放右子树
  9. delete bt;
  10. }
  11. }

前序遍历

  1. template<typename Datatype>
  2. void BiTree<Datatype>::PreOrder(BiNode<Datatype>* bt) {
  3. if (bt == nullptr) return;//递归调用结束条件
  4. else {
  5. cout << bt->data << '\t';//访问根结点数据域
  6. PreOrder(bt->lchild);//前序递归遍历bt左子树
  7. PreOrder(bt->rchild);//前序递归遍历bt右子树
  8. }
  9. }

中序遍历

  1. template<typename Datatype>
  2. void BiTree<Datatype>::InOrder(BiNode<Datatype>* bt) {
  3. if (bt == nullptr) return;
  4. else {
  5. InOrder(bt->lchild);
  6. cout << bt -> data << '\t';
  7. InOrder(bt->rchild);
  8. }
  9. }

后序遍历

  1. template<typename Datatype>
  2. void BiTree<Datatype>::PostOrder(BiNode<Datatype>* bt) {
  3. if (bt == nullptr) return;
  4. else {
  5. PostOrder(bt->lchild);
  6. PostOrder(bt->rchild);
  7. cout << bt->data << '\t';
  8. }
  9. }

层序遍历

  1. template<typename Datatype>
  2. void BiTree<Datatype>::LevelOrder() {
  3. BiNode<Datatype>* Q[100], * q = nullptr;
  4. int front = -1, rear = -1;//队列初始化
  5. if (root == nullptr) {//二叉树为空,算法结束
  6. return;
  7. }
  8. Q[++rear] = root;//根指针入队
  9. while (front != rear) {//当队列非空
  10. q = Q[++front];//出队
  11. cout << q->data << "\t";
  12. if (q->lchild != nullptr) Q[++rear] = q->lchild;
  13. if (q->rchild != nullptr) Q[++rear] = q->rchild;
  14. }
  15. }

结点个数

  1. template<typename Datatype>
  2. int BiTree<Datatype>::NodeNum(BiNode<Datatype> *bt) {
  3. //递归遍历所有结点 如果不是空结点的话,递归返回值加1
  4. if (bt == nullptr) return 0;
  5. else {
  6. return NodeNum(bt->lchild) + NodeNum(bt->rchild) + 1;
  7. }
  8. }

二叉树的深度

  1. template<typename Datatype>
  2. int BiTree<Datatype>::TreeDepth(BiNode<Datatype>* bt) {
  3. //每个节点都有自己的左右子树,每次返回当前节点左右子树长度大的那个
  4. //如果根节点为空,则深度为0,返回0,递归出口
  5. //否则深度至少为1,然后累加他们左右子树的深度
  6. int ldepth = 1, rdepth = 1;
  7. if (bt == nullptr) return 0;
  8. else {
  9. ldepth += TreeDepth(bt->lchild);
  10. rdepth += TreeDepth(bt->rchild);
  11. }
  12. return ((ldepth > rdepth) ? ldepth : rdepth);
  13. }

叶子结点

  1. template<typename Datatype>
  2. void BiTree<Datatype>::LeafNode(BiNode<Datatype>* bt) {
  3. //找到叶子结点返回值加1,返回值计数,
  4. //2种情况
  5. //1.节点为空 返回0,递归出去
  6. //2.每当到达叶子结点,返回1,递归给上一层函数
  7. if (bt != nullptr) {
  8. if (bt->lchild == 0 && bt->rchild == 0) {
  9. cout << bt->data;
  10. }
  11. LeafNode(bt->lchild);
  12. LeafNode(bt->rchild);
  13. }
  14. }

具体使用

  1. int main() {
  2. BiTree<char> T{};
  3. cout << "该二叉树的前序遍历序列是:";
  4. T.PreOrder();
  5. cout << "\n该二叉树的中序遍历序列是:";
  6. T.InOrder();
  7. cout << "\n该二叉树的后序遍历序列是:";
  8. T.PostOrder();
  9. cout << "\n该二叉树的层序遍历序列是:";
  10. T.LevelOrder();
  11. cout << "\n该二叉树的结点个数为:"<<T.NodeNum();;
  12. cout << "\n该二叉树的深度为:" <<T.TreeDepth();
  13. cout << "\n该二叉树叶子结点是:";
  14. T.LeafNode();
  15. return 0;
  16. }

注意:输入的格式

运行结果:


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/704754
推荐阅读
相关标签
  

闽ICP备14008679号