实验要求:

  1. 输入一个完全二叉树的层次遍历字符串,创建这个二叉树,输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个结果独立一行显示)。
  2. 输入二叉树前序序列和中序序列(各元素各不相同),创建这个二叉树,输出该二叉树的后序序列、层次遍历。

(输出格式如下图所示


实验难点:

  1. 输出格式控制(在下面的解法中运用一个全局变量commaFlag来控制逗号输出);
  2. 根据题目需求选择二叉树的描述方式,并制定二叉树类(下面的解法选择的是二叉树的链式描述,而且二叉树类中只包含必要的函数);
  3. 从层次序列构建二叉树,从前序序列和中序序列构建二叉树也是难点。

//my solution
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#define stringLength 50
using namespace std;//CommaFlag is used to judge whether a comma should be printed.
int commaFlag;//linked binary tree
template<class T>
struct binaryTreeNode
{T element;binaryTreeNode<T>* leftChild, * rightChild;binaryTreeNode() { leftChild = NULL; rightChild = NULL; }binaryTreeNode(const T& theElement){element = theElement;leftChild = NULL;rightChild = NULL;}binaryTreeNode(const T& theElement, binaryTreeNode<T>* theLC, binaryTreeNode<T>* theRC){element = theElement;leftChild = theLC;rightChild = theRC;}
};template<class T>
class binaryTree
{public://construct,destruct,copy_constrcutbinaryTree() { root = NULL; treeSize = 0; }binaryTree(binaryTreeNode<T>* r, int size) { root = r; treeSize = size; }~binaryTree() { clear(); }//preorder,inorder,postorder,levelordr,size,heightvoid preOrder() const { preOrder(root); }//前序遍历void inOrder() const { inOrder(root); }//中序遍历void postOrder() const { postOrder(root); }//后序遍历void levelOrder() const;//层次遍历void visit(binaryTreeNode<T>*) const;//访问并输出节点函数void clear() { erase(root); root = NULL; treeSize = 0; }//清空树,所有数据归零void erase(binaryTreeNode<T>*);//删除所有节点int size() const { return treeSize; }//节点数int height() const { return height(root); }//树高protected: binaryTreeNode<T>* root;int treeSize;void preOrder(binaryTreeNode<T>*) const;//前序遍历void inOrder(binaryTreeNode<T>*) const;//中序遍历void postOrder(binaryTreeNode<T>*) const;//后序遍历int height(binaryTreeNode<T>*) const;//树高
};template<class T>
void binaryTree<T>::visit(binaryTreeNode<T>* t) const
{commaFlag--;if (commaFlag > 0) cout << t->element << ",";else cout << t->element;
}template<class T>
void binaryTree<T>::preOrder(binaryTreeNode<T>* t) const
{if (t != NULL){visit(t);preOrder(t->leftChild);preOrder(t->rightChild);}
}template<class T>
void binaryTree<T>::inOrder(binaryTreeNode<T>* t) const
{if (t != NULL){inOrder(t->leftChild);visit(t);inOrder(t->rightChild);}
}template<class T>
void binaryTree<T>::postOrder(binaryTreeNode<T>* t) const
{if (t != NULL){postOrder(t->leftChild);postOrder(t->rightChild);visit(t);}
}template<class T>
void binaryTree<T>::levelOrder() const
{binaryTreeNode<T>* t=root;queue<binaryTreeNode<T>*> q;while (t != NULL){visit(t);if (t->leftChild != NULL) q.push(t->leftChild);if (t->rightChild != NULL) q.push(t->rightChild);if (!q.empty()){t = q.front();q.pop();}else return;}
}template<class T>
void binaryTree<T>::erase(binaryTreeNode<T>* t)
{if (t != NULL){erase(t->leftChild);erase(t->rightChild);delete t;}
}template<class T>
int binaryTree<T>::height(binaryTreeNode<T>* t) const
{if (t == NULL) return 0;int hLeft = height(t->leftChild);int hRight = height(t->rightChild);if (hLeft > hRight) return ++hLeft;else return ++hRight;
}//biuld a binary tree by using a level order array
binaryTreeNode<char>* creatTree_LevelOrder(char* theLevelArr, int index)
{binaryTreeNode<char>* t = NULL;if (index < strlen(theLevelArr)){t= new binaryTreeNode<char>(theLevelArr[index]);if ((2 * index + 1) < strlen(theLevelArr)) t->leftChild = creatTree_LevelOrder(theLevelArr, 2 * index + 1);if ((2 * index + 2) < strlen(theLevelArr)) t->rightChild = creatTree_LevelOrder(theLevelArr, 2 * index + 2);}return t;
}//biuld a binary tree by using a preorder array and a inorder array
binaryTreeNode<char>* creatTree_PreAndIn(char* pre, char* in,int nodeNum)
{if (pre == NULL || in == NULL || nodeNum == 0) return NULL;binaryTreeNode<char>* r = new binaryTreeNode<char>(*pre);if (nodeNum == 1) return r;int leftChildNum = 0;//计算当前根节点左子树的节点数while (in[leftChildNum] != *pre && leftChildNum < nodeNum) leftChildNum++;if (leftChildNum > 0)r->leftChild = creatTree_PreAndIn(pre + 1, in, leftChildNum);if ((nodeNum - leftChildNum - 1) > 0)r->rightChild = creatTree_PreAndIn(pre + leftChildNum + 1, in + leftChildNum + 1, nodeNum - leftChildNum - 1);return r;
}int main()
{char level[stringLength];cout << "Input1" << endl;cin >> level;binaryTree<char> t1(creatTree_LevelOrder(level, 0),strlen(level));cout << "Output1" << endl;commaFlag = t1.size(); t1.preOrder(); cout << endl;commaFlag = t1.size(); t1.inOrder(); cout << endl;commaFlag = t1.size(); t1.postOrder(); cout << endl;cout << t1.size() << '\n' << t1.height() << endl;char preOdr[stringLength], inOdr[stringLength];cout << "Input2" << endl;cin >> preOdr >> inOdr;binaryTree<char> t2(creatTree_PreAndIn(preOdr, inOdr, strlen(preOdr)), strlen(preOdr));cout << "Output2" << endl;commaFlag = t2.size(); t2.postOrder(); cout << endl;commaFlag = t2.size(); t2.levelOrder(); cout << endl;cout << "End" << endl;system("pause");return 0;
}

数据结构实验(C++实现):二叉树操作相关推荐

  1. 数据结构实验课:实验五、二叉树操作及应用

    实验五.二叉树操作及应用 一. 实验目的 掌握二叉树的定义.结构特征,以及各种存储结构的特点及使用范围,各种遍历算法.掌握用指针类型描述.访问和处理二叉树的运算.掌握前序或中序的非递归遍历算法. 二. ...

  2. 数据结构实验报告,二叉树的基本操作(C语言)

    数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...

  3. 数据结构实验三 图的操作与实现

    系列文章: 数据结构实验一 线性表.堆栈和队列的操作与实现 数据结构实验二 二叉树的操作与实现 数据结构实验三 图的操作与实现 数据结构实验四 查找和排序算法实现 一.实验目的: 1.领会图的两种主要 ...

  4. sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历

    数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descr ...

  5. 数据结构实验之求二叉树后序遍历和层次遍历

    数据结构实验之求二叉树后序遍历和层次遍历 Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<100 ...

  6. 数据结构实验六 图的操作实现

    数据结构实验六 图的操作实现 一.实验目的 1. 理解图的存储结构与基本操作: 2. 掌握图的创建过程 二.实验内容 1.根据下图,采用邻接矩阵的存储结构保存此图,并打印出邻接矩阵. 图的创建代码参考 ...

  7. 数据结构实验报告三 二叉树

    一.实验目的 1.掌握二叉树的基本特性 2.掌握二叉树的先序.中序.后序的递归遍历算法 3.理解二叉树的先序.中序.后序的非递归遍历算法 4.通过求二叉树的深度.叶子结点数和层序遍历等算法,理解二叉树 ...

  8. 数据结构实验二 :二叉树的操作与实现

    数据结构实验一:线性表,堆栈和队列实现 数据结构实验二 :二叉树的操作与实现 数据结构实验三: 图的操作与实现 数据结构实验四 : 查找和排序算法实现 文章目录 一.实验目的: 二.使用仪器.器材 三 ...

  9. 数据结构实验题目(C语言)

    目录 实验一:单列表的插入和删除 实验目的 实验要求 实验主要步骤 实验代码 实验二:二叉树操作设计和实现 实验目的 实验要求 实验内容 实验主要步骤 实验代码 实验一:单列表的插入和删除 实验目的 ...

  10. 广州大学学生实验报告,数据结构实验,二叉树的操作与实现

    广州大学学生实验报告 开课学院及实验室: 计算机科学与工程实验室 418              2022年10月3日 学院 计算机科学与网络工程 年级.专业.班 计科 姓名 Great Macro ...

最新文章

  1. 06一键直达:一键整理、秒搜、秒开任何文件、软件、网址
  2. java cpu 内存使用情况_java高cpu占用和高内存占用问题排查 (转)
  3. Python3 输入和输出
  4. linux设备驱动 注册 命令6,Linux设备驱动调试
  5. ubuntu上 grafana + influxdb + telegraf 安装配置
  6. 构建安全的 Web Services
  7. 树莓派串口通信编码_树莓派和STM32通过USB和串口通信记录
  8. vue+element+springboot前后端分离项目整合pageoffice实现在线编辑Word和Excel跟签章等
  9. 2FSK频谱matlab,数字调制系统在Matlab下的分析
  10. DirectAdmin教程-初级
  11. [转帖]从壹开始前后端分离【重要】║最全的部署方案 最丰富的错误分析
  12. 商店卖西瓜 10斤c语言,算法,西瓜切十刀,最多是多少块?
  13. 三年级江苏凤凰出版社计算机,苏教版小学信息技术三年级下册教案全集
  14. sd卡格式化怎么恢复?
  15. Ubuntu Server 18.04 WiFi配置静态ip
  16. 上海亚商投顾:沪指失守3300点 传媒、游戏板块逆市大涨
  17. 全志平台WiFi无法连接AP问题调试(1)问题分析
  18. MP4视频文件过大如何压缩?压缩视频的方法是什么?
  19. FSM有限状态机设计(Logisim)
  20. 腾讯云服务器关机了登不上,腾讯云服务器可以关机或者重启操作不?

热门文章

  1. Varnost slovenskih GSM omrežij III
  2. Linux列出磁盘信息
  3. vue3.0实现移动端自适应
  4. 动态规划范例——驿站马车问题
  5. GitHub被百万粉博主封杀!这份Java面试宝典做了什么?
  6. ESP8266(4)WIFI与IP/端口与UDP/TCP
  7. 方舟搭建服务器显示mod出错,为什么我方舟进不去mod服务器 | 手游网游页游攻略大全...
  8. python复制excel模板并保留表格样式
  9. 字体与版式设计 字体设计让你的信息变独特
  10. vuequilleditor编辑器的使用,字体无法对齐的问题