北京网站排名公司,推广网站的软件,中国国家人才培训网官网,东营有做网站的公司1.建堆和调整堆#xff08;插入和删除#xff09;
建堆和调整堆的过程是不一样的#xff1a;
建堆
从非终端节点编号的结点开始依次建立大根堆#xff0c;例如: 拿第2个图说#xff0c;首先比较-1#xff0c;7#xff0c;从中选一个小的#xff0c;即“-1”#xf…1.建堆和调整堆插入和删除
建堆和调整堆的过程是不一样的
建堆
从非终端节点编号的结点开始依次建立大根堆例如: 拿第2个图说首先比较-17从中选一个小的即“-1”再与父结点“7”比较。要比较两次。所以某非终端节点有两个孩子要比较两次有一个孩子只用比较一次。 插入
直接看一题 可以很直观的看到和建立堆的区别在第3个图中18并不需要与13进行对比直接与父结点对比即可。因为这个堆本来就是一个大根堆也就是说在插入之前13本来就是确定比25小的了所以直接将插入节点与父结点进行对比比父结点大肯定比13大了。所以在插入数据时只需要和父结点比较。 补充 比较次数最多等于树的高度减1因为树的高度为或者所以堆的向上调整的比较次数最多等于。 所以插入一个新元素的时间复杂度为O() 建堆的时间复杂度为O(n)。 删除
删除的过程通过一个题体现 看到第1个图一些人可能会想将大根堆的堆尾放到堆顶那么22肯定比53小只用比较53和其兄弟节点如果其兄弟节点大于53那么肯定大于22为什么还要将53与34的较大者再与22进行比较 这只是一种特殊情况来看另一种情况 如果这个图按上面的做法直接将98对比换父结点时而不与父结点10对比显然就错了。 所以删除操作堆顶数据从上至下对比如果其有两个孩子对比两次如果其有一个孩子对比一次。对比次数还是主要看树高时间复杂度为O(log2n) 2.不同的建堆方式
上面提到的建堆方式是给定序列直接调整成堆再看一遍过程: 而某些题是给定序列依次插入空堆那么过程就完全不一样了 补充二叉排序树与堆的差别 以小根堆为例堆的特点是双亲结点的关键字必然小于或等于该孩子结点的关键字而两个孩子结点的关键字没有次序规定。在二叉排序树中每个双亲结点的关键字均大于左子树结点的关键字均小于右子树结点的关键字也就是说每个双亲结点的左、右孩子的关键字有次序关系。这样当对两种树执行中序遍历后二叉排序树会得到一个有序的序列而堆则不一定能得到一个有序的序列。 既满足大根堆要求又满足二叉排序树的要求的二叉树除了单个结点