实验3二叉树的应用完整代码

简介: 实验3二叉树的应用完整代码

#include<iostream>
#include<Windows.h>
using namespace std;
//创建二叉树结构体;
typedef struct BiTNode {
  int data;
  struct BiTNode *lchild, *rchild;//左右孩子指针 
}BiTNode, *BiTree;
//构建一个循环队列
typedef struct Qnode {
  BiTNode *base;
  int front;//头
  int rear;//尾
}sqQueue;
class tree {
private:
  BiTree root;
  sqQueue q;
public:
  tree() {
    CreatBiTree(root);
  }
  BiTree get_root() {//得到root节点;
    return root;
  }
  //创建一个循环队列
  void InitQueue(sqQueue &q) {
    q.base = new BiTNode[5];
    q.front = q.rear = 0;
  }
  //创建二叉树
  BiTree CreatBiTree(BiTree &t) {
    int val;
    cin >> val;
    getchar();
    if (val <= 0) t = NULL;
    else {
      t = new BiTNode;
      t->data = val;
      CreatBiTree(t->lchild);
      CreatBiTree(t->rchild);
    }
    return t;
  }
  //先序遍历
  void PreOrderTraverse(BiTree &t) {
    if (!t) return;
    else {
      cout << t->data << " ";
      PreOrderTraverse(t->lchild);
      PreOrderTraverse(t->rchild);
    }
  }
  //中序排序
  void InOrderTraverse(BiTree &t) {
    if (!t) return;
    else {
      InOrderTraverse(t->lchild);
      cout << t->data << " ";
      InOrderTraverse(t->rchild);
    }
  }
  //后序遍历
  void PostOrderTraverse(BiTree &t) {
    if (!t) return;
    else {
      PostOrderTraverse(t->lchild);
      PostOrderTraverse(t->rchild);
      cout << t->data << " ";
    }
  }
  //层序遍历
  void LevelOrderTraverse(BiTree &t) {
    if (!t)return;
    else {
      InitQueue(q);
      q.base[q.rear] = *t;
      q.rear = (q.rear + 1) % 5;
    }
    while (q.front != q.rear) {
      BiTNode temp = q.base[q.front];
      cout << temp.data << " ";
      if (temp.lchild) {
        q.base[q.rear] = *temp.lchild;
        q.rear = (q.rear + 1) % 5;
      }
      if (temp.rchild) {
        q.base[q.rear] = *temp.rchild;
        q.rear = (q.rear + 1) % 5;
      }
      q.front = (q.front + 1) % 5;
    }
  }
  //统计节点的数目
  void Count_TreeEnds(BiTree &t, int &n) {
    if (t) {
      if (!t->lchild && !t->rchild)
        n++;
      Count_TreeEnds(t->lchild, n);
      Count_TreeEnds(t->rchild, n);
    }
  }
  //交换左右子树
  BiTree Exchange(BiTree &t) {
    if (!t)return NULL;
    BiTree lchild = Exchange(t->rchild);
    BiTree rchild = Exchange(t->lchild);
    t->lchild = lchild;
    t->rchild = rchild;
    return t;
  }
  //5. 计算并输出该二叉树的深度。
  int Depth(BiTree &t) {
    int l = 0, r = 0;
    if (t == NULL) return 0;
    l = Depth(t->lchild) + 1;
    r = Depth(t->rchild) + 1;
    return l > r ? l : r;
  }
};
int main() {
  tree T;
  int n = 0;//叶子结点
  int deep;//深度
  BiTree PT = T.get_root();
  cout << "先序遍历:";
  T.PreOrderTraverse(PT); cout << endl;
  cout << "中序遍历:";
  T.InOrderTraverse(PT); cout << endl;
  cout << "后序遍历:";
  T.PostOrderTraverse(PT); cout << endl;
  cout << "层序遍历:";
  T.LevelOrderTraverse(PT); cout << endl;
  cout << "叶子节点数:";
  T.Count_TreeEnds(PT, n);
  cout << n << endl;
  BiTree exT;
  exT = T.Exchange(PT);
  cout << "交换后的先序遍历:";
  T.PreOrderTraverse(exT); cout << endl;
  cout << "该二叉树的深度:";
  deep = T.Depth(exT); cout << deep << endl;
  system("pause");
  return 0;
}
目录
相关文章
|
5月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
5月前
数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
42 2
实验八 二叉树的实现
实验八 二叉树的实现
|
6月前
|
算法
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(上)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
36 1
|
6月前
|
机器学习/深度学习 算法 分布式数据库
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(下)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
40 1
|
6月前
|
C++
【数据结构&C++】超详细一文带小白轻松全面理解 [ 二叉平衡搜索树-AVL树 ]—— [从零实现&逐过程分析&代码演示&简练易懂]
【数据结构&C++】超详细一文带小白轻松全面理解 [ 二叉平衡搜索树-AVL树 ]—— [从零实现&逐过程分析&代码演示&简练易懂]
|
C语言 C++
【哈夫曼树】基本概念、构建过程及C++代码
【哈夫曼树】基本概念、构建过程及C++代码
246 0
|
存储 C++ 容器
使用C++编写一个图的深度和广度优先遍历的代码
使用C++编写一个图的深度和广度优先遍历的代码
110 0
|
存储 消息中间件 JavaScript
图解B+树的生成过程!
图解B+树的生成过程!
|
算法 数据库管理
【如何唯一确定一棵二叉树】思想分析及步骤详解
【如何唯一确定一棵二叉树】思想分析及步骤详解
290 0
【如何唯一确定一棵二叉树】思想分析及步骤详解