C++手搓完全二叉树和二叉堆
前言
本篇文章为笔者的读书笔记,未经允许请勿转载。如果对你有帮助记得点个赞(●’◡’●)
本文主要讲的完全二叉树和二叉堆的底层结构,以及二叉堆的数据测试;
后面还有make_heap和priority_queue之间的联系;
代码较长有兴趣的可以复制到自己电脑上运行一下;
源码如下:
stdafx.h
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// TODO: 在此处引用程序需要的其他头文件
#include<iostream>
#include<string>
#include<functional>
#include<algorithm>
#include<random>
#include <ctime>
#include<queue>
#include "Heap.hpp"
#include "CompleTree.hpp"
using namespace std;
CompleTree.hpp
#pragma once
#include<vector>
#include<cassert>
template <class T>
class CompleTree
{
public:
CompleTree()
{
_vec.resize(1);//完全二叉树下标从1开始的
}
//添加子节点
void addChild(T&& val)
{
_vec.push_back(val);
}
//删除节点
void removeChild()
{
_vec.pop_back();
}
//获取根节点
T& root()
{
assert(_vec.size() > 1);//表达式为假就会出现异常,在release模式不会出现。推荐用异常
return _vec[1];
}
//获取左子树
T& left(size_t index)
{
assert(index * 2 < _vec.size());
return _vec[index * 2];
}
//获取右子树
T& right(size_t index)
{
assert(index * 2 + 1 < _vec.size());
return _vec[index * 2 + 1];
}
//获取父亲节点
T& parent(size_t index)
{
assert(index / 2 > 0);
return _vec[index / 2];
}
private:
std::vector<T> _vec;
};
Heap.hpp
#pragma once
#include<cassert>
#include<algorithm>
template <class T>
class Heap
{
public:
Heap(int length) :length(length + 1), count(1)//二叉堆底层完全二叉树,从下标为1的地方开始存储数据
{
data = new T[this->length]();
//T data[this->length] = { 0 }; 栈内存
//data = new T[this->length](); 堆内存
}
//拷贝构造,搞清楚调用者和实参
Heap(const

本文是一篇读书笔记,主要介绍完全二叉树和二叉堆的底层结构,以及二叉堆的数据测试。还探讨了make_heap和priority_queue之间的联系,给出相关源码,同时提到二叉堆与优先队列在元素释放上的差异。
最低0.47元/天 解锁文章
2471

被折叠的 条评论
为什么被折叠?



