实验要求:
- 输入一系列不为零的正整数(最多不超过20个),遇到0代表输入结束(不包含0)。
- 根据上面输入的数据序列,用初始化方法创建最大堆(不要用节点依次插入的办法创建最大堆),然后输出最大堆的层次序列。
- 输出用堆排序后的排序结果。
- 根据上面输入的数据,创建二叉搜索树(关键字不允许重复,如遇重复,则不重复插入该关键字),输出二叉搜索树的前序序列、中序序列(分行输出)。
(输出格式如下图所示)
小提示:
这次试验并不难,而且用到了上一次实验的部分代码,可以进行代码复用(复制),嘿嘿,比如用全局变量commaFlag控制输出格式,还有搜索树的部分函数可以从上一个实验中借鉴(照抄)。
//my solution
#include <iostream>
#include <algorithm>
using namespace std;
int commaFlag;
//Max heap part
template<class T>
class maxHeap
{
public:
maxHeap() {
heap = NULL; heapSize = 0; }
void deactivate() {
heap = NULL; }//将heap赋空,防止错误释放
void initialize(T*, int);
T pop();
void levelOrder() const;
protected:
T* heap;
int heapSize;
};
template<class T>
void maxHeap<T>::initialize(T* initHeap, int initSize)
{
//initialize
delete[]heap;
heap = initHeap;
heapSize = initSize;
//standardize
for (int r = heapSize / 2; r >= 1; r--)
{
T rElement = heap[r];
int rChild = 2 * r;
while (rChild <= heapSize)
{
//rChild is the max one of r'childs
if (rChild < heapSize && heap[rChild] < heap[rChild + 1]) rChild++;
if (rElement < heap[rChild])
{
heap[rChild / 2] = heap[rChild];
rChild *= 2;
}
else break;
}
heap[rChild / 2] = rElement;
}
}
template<class T>
T maxHeap<T>::pop()
{
T top = heap[1];
T lastElement = heap[heapSize--];
int current = 1, child