网站开发需求书打码兔怎么和网站做接口
news/
2025/9/28 7:27:23/
文章来源:
网站开发需求书,打码兔怎么和网站做接口,大连网站排名,亿方云企业网盘二叉堆的介绍
二叉堆是完全二元树或者是近似完全二元树#xff0c;按照数据的排列方式可以分为两种#xff1a;最大堆和最小堆。
最大堆#xff1a;父结点的键值总是大于或等于任何一个子节点的键值#xff1b; 最小堆#xff1a;父结点的键值总是小于或等于任何一个子…二叉堆的介绍
二叉堆是完全二元树或者是近似完全二元树按照数据的排列方式可以分为两种最大堆和最小堆。
最大堆父结点的键值总是大于或等于任何一个子节点的键值 最小堆父结点的键值总是小于或等于任何一个子节点的键值。
示意图如下 二叉堆一般都通过”数组”来实现。数组实现的二叉堆父节点和子节点的位置存在一定的关系。有时候我们将”二叉堆的第一个元素”放在数组索引0的位置有时候放在1的位置。当然它们的本质一样(都是二叉堆)只是实现上稍微有一丁点区别。 假设”第一个元素”在数组中的索引为 0 的话则父节点和子节点的位置关系如下 (01) 索引为i的左孩子的索引是 (2*i1); (02) 索引为i的左孩子的索引是 (2*i2); (03) 索引为i的父结点的索引是 floor((i-1)/2); 实现
以最大堆为例
template class T
class MaxHeap{private:T *mHeap; // 数据int mCapacity; // 总的容量int mSize; // 实际容量private:// 最大堆的向下调整算法void filterdown(int start, int end);// 最大堆的向上调整算法(从start开始向上直到0调整堆)void filterup(int start);public:MaxHeap();MaxHeap(int capacity);~MaxHeap();// 返回data在二叉堆中的索引int getIndex(T data);// 删除最大堆中的dataint remove(T data);// 将data插入到二叉堆中int insert(T data);// 打印二叉堆void print();
};
添加
假设在最大堆[90,80,70,60,40,30,20,10,50]种添加85需要执行的步骤如下 如上图所示当向最大堆中添加数据时先将数据加入到最大堆的最后然后尽可能把这个元素往上挪直到挪不动为止 将85添加到[90,80,70,60,40,30,20,10,50]中后最大堆变成了[90,85,70,60,80,30,20,10,50,40]。
/** 最大堆的向上调整算法(从start开始向上直到0调整堆)** 注数组实现的堆中第N个节点的左孩子的索引值是(2N1)右孩子的索引是(2N2)。** 参数说明* start -- 被上调节点的起始位置(一般为数组中最后一个元素的索引)*/
template class T
void MaxHeapT::filterup(int start)
{int c start; // 当前节点(current)的位置int p (c-1)/2; // 父(parent)结点的位置 T tmp mHeap[c]; // 当前节点(current)的大小while(c 0){if(mHeap[p] tmp)break;else{mHeap[c] mHeap[p];c p;p (p-1)/2; } }mHeap[c] tmp;
}/* * 将data插入到二叉堆中** 返回值* 0表示成功* -1表示失败*/
template class T
int MaxHeapT::insert(T data)
{// 如果堆已满则返回if(mSize mCapacity)return -1;mHeap[mSize] data; // 将数组插在表尾filterup(mSize); // 向上调整堆mSize; // 堆的实际容量1return 0;
}
删除
假设从最大堆[90,85,70,60,80,30,20,10,50,40]中删除90需要执行的步骤如下 /* * 最大堆的向下调整算法** 注数组实现的堆中第N个节点的左孩子的索引值是(2N1)右孩子的索引是(2N2)。** 参数说明* start -- 被下调节点的起始位置(一般为0表示从第1个开始)* end -- 截至范围(一般为数组中最后一个元素的索引)*/
template class T
void MaxHeapT::filterdown(int start, int end)
{int c start; // 当前(current)节点的位置int l 2*c 1; // 左(left)孩子的位置T tmp mHeap[c]; // 当前(current)节点的大小while(l end){// l是左孩子l1是右孩子if(l end mHeap[l] mHeap[l1])l; // 左右两孩子中选择较大者即mHeap[l1]if(tmp mHeap[l])break; //调整结束else{mHeap[c] mHeap[l];c l;l 2*l 1; } } mHeap[c] tmp;
}/** 删除最大堆中的data** 返回值* 0成功* -1失败*/
template class T
int MaxHeapT::remove(T data)
{int index;// 如果堆已空则返回-1if(mSize 0)return -1;// 获取data在数组中的索引index getIndex(data); if (index-1)return -1;mHeap[index] mHeap[--mSize]; // 用最后元素填补filterdown(index, mSize-1); // 从index位置开始自上向下调整为最大堆return 0;
}
二叉堆的C实现(完整源码)
/*** 二叉堆(最大堆)** author skywang* date 2014/03/07*/#include iomanip
#include iostream
using namespace std;template class T
class MaxHeap{private:T *mHeap; // 数据int mCapacity; // 总的容量int mSize; // 实际容量private:// 最大堆的向下调整算法void filterdown(int start, int end);// 最大堆的向上调整算法(从start开始向上直到0调整堆)void filterup(int start);public:MaxHeap();MaxHeap(int capacity);~MaxHeap();// 返回data在二叉堆中的索引int getIndex(T data);// 删除最大堆中的dataint remove(T data);// 将data插入到二叉堆中int insert(T data);// 打印二叉堆void print();
};/* * 构造函数*/
template class T
MaxHeapT::MaxHeap()
{new (this)MaxHeap(30);
}template class T
MaxHeapT::MaxHeap(int capacity)
{mSize 0;mCapacity capacity;mHeap new T[mCapacity];
}
/* * 析构函数*/
template class T
MaxHeapT::~MaxHeap()
{mSize 0;mCapacity 0;delete[] mHeap;
}/* * 返回data在二叉堆中的索引** 返回值* 存在 -- 返回data在数组中的索引* 不存在 -- -1*/
template class T
int MaxHeapT::getIndex(T data)
{for(int i0; imSize; i)if (datamHeap[i])return i;return -1;
}/* * 最大堆的向下调整算法** 注数组实现的堆中第N个节点的左孩子的索引值是(2N1)右孩子的索引是(2N2)。** 参数说明* start -- 被下调节点的起始位置(一般为0表示从第1个开始)* end -- 截至范围(一般为数组中最后一个元素的索引)*/
template class T
void MaxHeapT::filterdown(int start, int end)
{int c start; // 当前(current)节点的位置int l 2*c 1; // 左(left)孩子的位置T tmp mHeap[c]; // 当前(current)节点的大小while(l end){// l是左孩子l1是右孩子if(l end mHeap[l] mHeap[l1])l; // 左右两孩子中选择较大者即mHeap[l1]if(tmp mHeap[l])break; //调整结束else{mHeap[c] mHeap[l];c l;l 2*l 1; } } mHeap[c] tmp;
}/** 删除最大堆中的data** 返回值* 0成功* -1失败*/
template class T
int MaxHeapT::remove(T data)
{int index;// 如果堆已空则返回-1if(mSize 0)return -1;// 获取data在数组中的索引index getIndex(data); if (index-1)return -1;mHeap[index] mHeap[--mSize]; // 用最后元素填补filterdown(index, mSize-1); // 从index位置开始自上向下调整为最大堆return 0;
}/** 最大堆的向上调整算法(从start开始向上直到0调整堆)** 注数组实现的堆中第N个节点的左孩子的索引值是(2N1)右孩子的索引是(2N2)。** 参数说明* start -- 被上调节点的起始位置(一般为数组中最后一个元素的索引)*/
template class T
void MaxHeapT::filterup(int start)
{int c start; // 当前节点(current)的位置int p (c-1)/2; // 父(parent)结点的位置 T tmp mHeap[c]; // 当前节点(current)的大小while(c 0){if(mHeap[p] tmp)break;else{mHeap[c] mHeap[p];c p;p (p-1)/2; } }mHeap[c] tmp;
}/* * 将data插入到二叉堆中** 返回值* 0表示成功* -1表示失败*/
template class T
int MaxHeapT::insert(T data)
{// 如果堆已满则返回if(mSize mCapacity)return -1;mHeap[mSize] data; // 将数组插在表尾filterup(mSize); // 向上调整堆mSize; // 堆的实际容量1return 0;
}/* * 打印二叉堆** 返回值* 0表示成功* -1表示失败*/
template class T
void MaxHeapT::print()
{for (int i0; imSize; i)cout mHeap[i] ;
}int main()
{int a[] {10, 40, 30, 60, 90, 70, 20, 50, 80};int i, len(sizeof(a)) / (sizeof(a[0])) ;MaxHeapint* treenew MaxHeapint();cout 依次添加: ;for(i0; ilen; i){cout a[i] ;tree-insert(a[i]);}cout \n 最 大 堆: ;tree-print();i85;tree-insert(i);cout \n 添加元素: i;cout \n 最 大 堆: ;tree-print();i90;tree-remove(i);cout \n 删除元素: i;cout \n 最 大 堆: ;tree-print();cout endl; system(pause);return 0;
}
效果如下
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920320.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!