c++完全二叉树和二叉堆

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

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值