大小堆的实现,删除,添加
来源:互联网 发布:java选择题及答案 编辑:程序博客网 时间:2024/06/06 09:58
大小堆的实现 删除 添加
最小堆:任一结点的关键码均小于等于它的左右孩子的关键码,位于堆顶结点的关键码最小
最大堆:任一结点的关键码均大于等于它的左右孩子的关键码,位于堆顶结点的关键码 最大
先建堆:利用二叉树建小堆方法
先找到第一个非叶子节点,然后检查它是否有左右叶子(都有选其小的),再和节点比较,若小于该节点,则交换这两个元素;接着把这个节点当作叶子,找他的节点,再按上述方法做;
相关代码:
#include<iostream>
#include<vector>
#include<assert.h>
using namespace std;
template<typename T>
class HEAP
{
public:
void Adtreesort(T* arr, int size)
{
assert(arr);
for (int i = 0; i < size; ++i)
{
Heap.push_back(arr[i]);
}
int root = (size - 1) / 2;
while (root--)
{
AdtreeDown(root);
}
}
//堆添加
void insert(T data)
{
Heap.push_back(data);
int root = (Heap.size() - 1) / 2;
int temp = Heap.size() - 1;
while (temp>root)
{
if (Heap[temp] < Heap[root])
{
std::swap(Heap[Heap.size() - 1], Heap[root]);
temp = root;
root = (root - 1) / 2;
}
else
{
return;
}
}
}
//堆删除
void Erase()
{
swap(Heap[0],Heap[Heap.size()-1]);
Heap.pop_back();
AdtreeDown(0);
}
//打印
void Print()
{
for (size_t i = 0; i < Heap.size(); ++i)
{
cout << Heap[i] << "->";
}
cout << endl;
}
private:
void AdtreeDown(int root) //调整节点
{
int left = root * 2 + 1;
int right = left + 1;
int Min = left;
while (left<Heap.size())
{
if (Heap[left] > Heap[right])
{
Min = right;
}
if (Heap[root] > Heap[Min])
{
swap(Heap[root], Heap[Min]);
root = Min;
left = root * 2 + 1;
right = left + 1;
Min = left;
}
else
{
break;
}
}
}
private:
vector<T> Heap;
};
调试代码:
void Fun()
{
int arr[] = { 1, 5, 6, 3, 4, 7, 9, 8, 0 };
HEAP<int> h;
h.Adtreesort(arr,9);
h.insert(2);
h.Print();
h.Erase();
h.Print();
}
#include<vector>
#include<assert.h>
using namespace std;
template<typename T>
class HEAP
{
public:
void Adtreesort(T* arr, int size)
{
assert(arr);
for (int i = 0; i < size; ++i)
{
Heap.push_back(arr[i]);
}
int root = (size - 1) / 2;
while (root--)
{
AdtreeDown(root);
}
}
//堆添加
void insert(T data)
{
Heap.push_back(data);
int root = (Heap.size() - 1) / 2;
int temp = Heap.size() - 1;
while (temp>root)
{
if (Heap[temp] < Heap[root])
{
std::swap(Heap[Heap.size() - 1], Heap[root]);
temp = root;
root = (root - 1) / 2;
}
else
{
return;
}
}
}
//堆删除
void Erase()
{
swap(Heap[0],Heap[Heap.size()-1]);
Heap.pop_back();
AdtreeDown(0);
}
//打印
void Print()
{
for (size_t i = 0; i < Heap.size(); ++i)
{
cout << Heap[i] << "->";
}
cout << endl;
}
private:
void AdtreeDown(int root) //调整节点
{
int left = root * 2 + 1;
int right = left + 1;
int Min = left;
while (left<Heap.size())
{
if (Heap[left] > Heap[right])
{
Min = right;
}
if (Heap[root] > Heap[Min])
{
swap(Heap[root], Heap[Min]);
root = Min;
left = root * 2 + 1;
right = left + 1;
Min = left;
}
else
{
break;
}
}
}
private:
vector<T> Heap;
};
调试代码:
void Fun()
{
int arr[] = { 1, 5, 6, 3, 4, 7, 9, 8, 0 };
HEAP<int> h;
h.Adtreesort(arr,9);
h.insert(2);
h.Print();
h.Erase();
h.Print();
}
int main()
{
Fun();
system("pause");
return 0;
}
{
Fun();
system("pause");
return 0;
}
0 0
- 大小堆的实现,删除,添加
- 二叉堆的添加及删除元素方法实现
- 堆的添加,删除元素
- 堆的实现(大小堆及 优先队列)
- 【数据结构】大小堆的实现及堆排序
- 大小堆实现
- 堆插入和删除的简单实现
- 实现最大堆的插入和删除!
- 堆的插入删除实现和优化
- java实现堆的操作(建堆,插入,删除)
- 大小堆的实现与实现优先级队列
- 最小堆操作(元素的添加和删除)
- 堆的创建、插入、删除,模板参数实现堆以及模板的模板参数实现堆
- 堆大小的最大值
- 估计堆的大小
- 大小堆的建立
- Theory:大小顶堆,排序,插入,删除
- 17.完全二叉树 构建 最大堆 元素的添加和删除(堆排)
- remove comment
- LeetCode | Swap Nodes in Pairs
- java基础知识
- 继承存在时的程序执行流程
- AsynTask异步任务的使用(再也忘不了了)
- 大小堆的实现,删除,添加
- 老九门 明信片 周边 海报 赵丽颖 陈伟霆 马克杯
- C语言程序设计谭浩强版 七
- unity使用的第三方工具
- wpf C# 操作DirectUI窗口 SendMessage+MSAA
- Js笔记:闭包
- Function中的相关成员
- R给对象赋值
- 100天土鸡饲养计划(12,13)