记录一道遇到的考研真题

特性分析

DEAP为一颗完全二叉树,左子树小堆,右子树大堆,故左右子树分别可以用l[]、r[]数组存储,用m和n分别表示当前两完全二叉树的结点,左右子树高度差为1,且左子树的高度始终大于等于右子树的高度。

插入情况

当均为空二叉树或者满二叉树(m=2k-1)应该插入到小堆;小堆满后,插入到大堆。即在小堆插入要满足:

否则就要插入到大堆。

调堆情况

在小堆m处插入节点x后,若x的值不大于大堆的m/2节点的值,则在小堆调整。否则,节点x与大堆的m/2结点交换,然后进行大堆调堆。在大堆n处插入结点x后,若x不小于小堆的n结点,则在大堆调整。否则,结点x与小堆的n结点交换,然后进行小堆调堆。

(1)插入4后

4先插入大堆,4<小堆中对应的19,和19交换。之后开始调整小堆即可。大堆显然无需调整。

(2)插入代码(有点乱,建议文字屡清楚思路)

//l[]为小堆,r[]为大堆,m、n分别为两个堆的元素个数,x为待插入元素
void insertDEPA(int l[],int r[],m,n,x)
{
if(m>=n && m!=2^k-1 && [log2m]-[log2n]<=1) //[]这里暂时代表向下取整,k为二叉树高度
{
m++;
if(x>r[m/2]) //交换
{
l[m]=r[m/2];
c=m/2;
f=c/2;
while(f>0 && r[f]<x) //调大堆
{
r[c]=r[f];
c=f;
f=c/2;
}
r[c]=x;
}
else //调小堆
{
c=m;
f=c/2;
while(f>0 && l[f]>x)
{
l[c]=l[f];
c=f;
f=c/2;
}
l[c]=x;
}
else //调大堆
{
c=n;
f=c/2;
while(f>0 && r[f]<x)
{
r[c]=r[f];
c=f;
f=c/2;
}
r[c]=x;
}
}
}

最新文章

  1. MariaDB Galera Cluster部署手册
  2. C#接口的经典案例
  3. asp.net中C#获取字符串中汉字的个数实例
  4. Linux Bash终端支持中文显示
  5. 转:搭建Hive的图形界面
  6. 改变status bar的状态
  7. nginx+lua安装配置
  8. 总结scala(一)
  9. python selenium+phantomjs alert()弹窗报错
  10. staff
  11. prettier &amp; codes format
  12. This function has none of Deterministic,no sql,or reads sql data in its declaration and binary logging is enabled(you *might* want to use the less safe log_bin_trust_function_creators variable
  13. slice.indices()/collections.Counter笔记
  14. jenkins不能取到svn最新版本问题的解决
  15. sql的执行流程
  16. [UE4]事件处理(Handling Events)和委托(Delegate)代码示例(二)【C++】
  17. UVA-1153 Keep the Customer Satisfied (贪心)
  18. CentOS 7.4 shell 不显示当前用户和路径的问题
  19. Tarjan模版(链式向前星表示方法)
  20. 最大加权矩形 压缩+前缀和+dp

热门文章

  1. Weblogic Coherence组件漏洞初探CVE-2020-2555
  2. rootfs -根文件系统制作
  3. Mybatis公司开发常用!
  4. composer 包 slim使用案例,一个简单的路由解决方案
  5. CodeForce-799B T-shirt buying (STL_set)
  6. python 小鸡飞行小游戏
  7. PHP中的日期相关函数(三)
  8. 使用uView UI+UniApp开发微信小程序--微信授权绑定和一键登录系统
  9. sunny 内网穿透使用。
  10. 定要过python二级 真题 第四套