首页 > 编程知识 正文

二叉堆的建立,二叉堆和二叉树

时间:2023-05-04 13:56:17 阅读:187084 作者:1506

两股山本质上是完整的二叉树,分为最小的山和最大的山,两股山的根节点叫山顶

最大堆:最大堆的任何父节点的值大于或等于左节点和右节点的值,最大堆的顶层是整个堆的最大元素

最小堆:最小堆的任何父节点的值小于或等于左节点和右节点的值,最小堆的顶部是此堆中的最小元素

二叉山的几个操作:

1、插入节点:插入位置为完全二叉树的最后位置; 因为堆插入操作是单节点的“浮”,并且平均交换次数是堆高度的一半,所以时间复杂度是o(logn )

2、删除节点:删除的是堆顶节点; 因为移除堆操作是单节点“下沉”,并且平均交换次数是堆高度的一半,所以时间复杂度是o

3、构建叉形峰:将完全无序的二叉树调整为叉形峰,本质上是将所有非叶节点依次“下沉”; 时间的复杂性是o(n )

/** *构建二叉炉*/public class Adjust { /** * '浮'调* * @ param arr */publicstaticvoidupadjust { int [ ] arr } { if (arr ) intparentindex=(childindex-1 )/2; //保存插入的叶节点的值,然后输入最后一个赋值int temp=arr[childIndex]; while (child index0temparr [ parent index ] ) /即使实际不更换,也可以通过单向赋值来指定arr [ child index ]=arr [ parent index ]; childIndex=parentIndex; 部件索引=(部件索引-1)/2; } arr[childIndex]=temp; } /** * '下沉'调整* * @param arr调整对象值* @param parentIndex下沉对象的父节点* @param length堆的有效大小*/publicstaticvoiddownadjust () while({ childIndexlength )//如果右子代小于左子代,则为右子代if ) child index1length arr [ child index1] arr [ child index ] ) child //不进行交换,只需单方面分配值就可以满足arr [ parent index ]=arr [ child index ]; parentIndex=childIndex; childIndex=2 * childIndex 1; } arr[parentIndex]=temp; } /** *构建堆* * @ param arr */publicstaticvoidbuildheap (int [ ] arr ) /从最后一个非叶节点开始按顺序下沉操作for(intI=) arr.length -。 I--; {downadjust(arr,I,arr.length ); } publicstaticvoidmain (string (args ) int (arr=new int ) ) 1、3、2、6、5、7、8、9、10、0 ); upadjust(ARR; system.out.println (arrays.tostring (arr ) ); arr=new int [ ] { 7,1,3,10,5,2,8,9,6 }; 构建帮助(arr ); system.out.println (arrays.tostring (arr ) ); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。