首页 > 编程知识 正文

二叉树转换为数组,哈夫曼树是完全二叉树吗?

时间:2023-05-05 19:26:14 阅读:167942 作者:1357

完全二叉树可以理解为数组。 数组中某个要素的二叉树中的左子为2*i 1,右子为2*i 2。 (I是该要素索引),一个要素的父节点是(i-1 )/2

萝卜山:父节点大于子节点的完全二叉树。

小根堆:父节点小于子节点的完整二叉树。

在将一个要素插入完全二叉树时,对其父要素进行比较,比较次数为二叉树的高度,其调整成本为,在追加第I个节点时,由于前面的i-1个节点已经形成完全二叉树,其调整成本为i 1个

如果一个大根的山的要素变更,将其与左右孩子节点中的最大值进行比较,如果小于孩子节点的值,则可以将其与孩子节点的最大值进行交换,循环到叶的节点再次得到大根的山。

public class big tree { public static int [ ] creatarr () /长度为随机数组int ) ) arr=newint((int ) ) Math.random ) * 100 } fff i arr.length; I () arr[I]=(int ) ) Math.random () * 100 - Math.random ) ) 59 ); }heapsort(arr ); 返回区域; } publicstaticvoidheapsort (int [ ] arr ) if ) null==arr||arr.length2) { return; }for(intI=0; i arr.length; I ) heapbigsort(ARR,I ); (} int heapRight=arr.length; /*以下内容按萝卜堆数组进行排序*,然后重新调整萝卜堆* *与堆的第一个元素和最后一个元素交换,以获取最后一个数量为最大的堆*。 然后,数组有边界。 因为最后一个元素已经是最大值*/Huan(arr,0,--heapRight )。 while(heapright0) dobigheadle (arr,0,--heapRight ); Huan(ARR,0,heapRight ); }//将第一个元素为最小值的堆放入萝卜堆publicstaticvoiddobigheadle (int [ ] arr,int L,int R ) { int leftChild=2 * L 1; //左子树索引while(leftchildr ) (/* )获取左、右孩子中值最大的元素的索引,如果leftChild 1)右孩子索引)大于或等于r (r是数组边界) */leftt arr[leftChild] arr[leftChild 1]? leftchild : leftchild 1: leftchild; /* *父节点是子节点或更高版本,包含循环* */if (arr [ l ]=arr [ leftchild ] (break; (Huan ) ARR,leftChild,l ); L=leftChild; leftChild=leftChild * 2 1; } } /** *数组为萝卜山* * @ param arr * @ paramindex */publicstaticvoidheapbigsort (intarr [ ],int index ) while ) arr ) index }publicstaticvoidHuan(int[]arr,int调皮的彩虹,int index ) { int tem=arr[调皮的彩虹); arr[淘气的彩虹]=arr[index]; arr[index]=tem; } publicstaticvoidmain (string [ ] args ) { int[] ints=creatArr ); for(intI=0; i ints.length; I ) system.out.print(ints[I] ' ); } }

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