美文网首页
数据结构(8) 二叉堆

数据结构(8) 二叉堆

作者: Yossef | 来源:发表于2018-01-22 19:25 被阅读0次

二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。

二叉堆实用数组来表示,存贮节点的,其规则如图(1)

(1)

二叉堆是完全根据完全二叉树的规则来向数组里放置元素的

其首个元素 0 他的左右分支 分别对应这数组里的 元素 1 和元素 2 元素的左右分支 对应着 元素 3 和元素 4  也就是说 1 比0 小 2 比1 大 (对应着二叉树的左右分支),因为和完全二叉树非常相似所以我们能得出 和完全二叉树 相同的规律  0的左分支对应着他的 2*n+1 = 1 右分支为 2*n+2 = 2;由这个条件 我们可以对 二叉堆 进行 插入节点 以及 遍历二叉堆;

用js写一个二叉堆对象:

function Heap(){

        this.heapBody = [];

        this.end = 0; //设置一个尾指针 用来遍历值

        this.add = function(value){

                n = 0;

                do{

                        pointValue = this.heapBody[n];//用来表示这个值

                        if(typeof(pointValue)!=undefined&&pointValue!=null){//如果定义了且不是null 那么证明有值 再往下找 

                                if(value<pointVlaue){//如果要添加的值 小于这个值的本身 就去找 2n+1 也就是完全二叉树中的 左节点

                                            n = 2*n+1;

                                }else{//大于 就去找 2n+2 也就是二叉树中的 右子节点

                                            n = 2*n+2;

                                }

                        }else{//如果遍历到的值 为未定义 或者 null 那么证明他已经没有子节点了

                                for(;this.end<n;this.end++){//先用尾指针遍历一边 把未定义的 都插入null 防止乱了完全二叉树的规则

                                            this.headBody[this.end] = null;

                                }

                                this.headBody[n] = value; //最后把值 给最后一位节点 并且退出循环

                                break;

                        }

                }while(true);

        }

        this.iterater = function(){//二叉堆遍历

                   var thisa = this; // 把this的值 放进一个变量中 防止this跳转

                   var rsArr = [];//创建一个数组 用来存放 遍历出来的值

                    function sort(n){//写一个排序方法

                            p = 2*n+1;

                            v = thisa.heapBody[p];  

                            if(typeof(v)!='undefined'&&v=null){//递归 2*n+1 也就是左子树

                                        sort(p);

                            }

                            rsArr.push(thisa.heapBody[n]);

                            p = 2*n+2;

                            v = thisa.heapBody[p]; 

                             if(typeof(v)!='undefined'&&v=null){//递归 2*n+2 也就是右子树

                                        sort(p);

                            }

                    }

                    sort(0);//从下表为0的元素 开始递归 最会将把所有元素按照大小顺序 插入到数组中

                    return rsArr;//返回插入完成的数组;

        }

}

相关文章

  • 看图说话数据结构之二项队列(优先队列)——原理解析

    数据结构之二叉堆(优先队列)——原理解析,数据结构之二叉堆(优先队列)——java实现,数据结构之左式堆(优先队列...

  • 二叉堆(Binary Heap)

    二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下: 二叉堆性质 二叉堆操作 应用 二叉堆性质: 堆(Hea...

  • 数据结构 - 概要

    数组 链表 堆/栈/队列 树 数据结构 - 二叉树数据结构 - 二叉查找树数据结构 - 平衡二叉树数据结构 - A...

  • 堆(Heap)

    堆 堆也是一种树状的数据结构,常见的堆实现有: 二叉堆(Binary Heap, 完全二叉堆) 多叉堆(D-hea...

  • 堆结构的实现

    堆的定义: 这里的堆是指一种数据结构(或数据结构属性),非指堆内存。堆属性用二叉树来体现,具有堆属性的数据结构才可...

  • 数据结构(8) 二叉堆

    二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。 二叉堆实用数组来表示,存贮节点...

  • 看图说话数据结构之二叉堆(优先队列)——java实现

    上篇文章数据结构之二叉堆(优先队列)——原理解析详细介绍了二叉堆的实现原理,本篇文章在上篇文章的基础上,介绍二叉堆...

  • Python札记46_堆Heap

    堆Heap是一种数据结构,堆的实现是通过二叉堆,也是一种二叉树。二叉树Binary Tree是每个节点最多有两个子...

  • 数据结构中堆、栈和队列的理解

    一、堆 堆是一种经过排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构...

  • iOS堆、栈和队列

    堆 堆是一种经过排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构中通...

网友评论

      本文标题:数据结构(8) 二叉堆

      本文链接:https://www.haomeiwen.com/subject/hscraxtx.html