数据结构(7) 完全二叉树

完全二叉树:

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

也就是说除了最底下一层可以不满,上面的层都得满节点,而且最底下一层也必须集中在最左边。可以说,右边有左边就一定满,下面有,上面就一定满。

完全二叉树




非完全二叉树




非完全二叉树



用js写一个完全二叉树:

//写一个节点编号,因为完全二叉树遵循右边有左边一定满,下面有,上面一定满,但二叉树又是左小右大的插入规则,所以没有特定的一串值很难变成完全二叉树,所以我们给每个节点按顺序放上编号,如果前面的不存在,就给他一个null值以达到完全二叉树的规则;


带节点编号的完全二叉树

从上图我们可以发现一个规律 左节点的编号是其父节点的编号乘2加1 右节点的编号是其父节点的编号乘2加2 掌握这个规律 对节点的插入就容易了很多

function Node(number,value){//number就是节点编号

        this.value = value||null;

        this.left = null;

        this.right = null;

        this.number = number||0;

        this.add = function(value){

            if(this.value == null){

                this.value = value;

                return 0;

            }

            if(value<this.value){

                if(this.left!=null){

                        this.left.add(value);

                }else{

                        num = 2*this.number+1;

                        this.left = new Node(num,value);

                        return num;

                }    

            }else{

                if(this.right!=null){

                        this.right.add(value);

                }else{

                        num = 2*this.number+2;

                        this.right = new Node(num,value);

                        return num;//返回节点编号

                }

            }

        } //这种插入节点的方法就是普通的加入节点的方法只是多返回一个节点编号 并不能构成完全二叉树,所以我们还要下一个补充不够的节点的方法

        this.fullup = function(nodeId){

                if(this.number<nodeId){//防止加多,所以先要判断是不是小于最后一个节点

                        if(this.left == null){//先找左

                                num = 2*this.number+1;

                                if(num<nodeId){//在判断一次 防止加多

                                      this.left = new Node(num)

                                }else{

                                        return;

                                }

                        }

                        this.left.fullup(nodeId);

                        if(this.right == null){//找右

                                num = 2*this.number+2;

                                if(num<nodeId){

                                        this.right = new Node(num);

                                }else{

                                        return;

                                }

                        }

                        this.right.fullup(nodeId);

                }

        }

        //递归遍历 前几章有讲解 这章不多做解释了。

        this.iterate=function(arr){

                if(this.left!=null){

                        this.left.iterate(arr);

                }

                if(this.value!=null){

                        arr.push(this.value);

                 }

                 if(this.right!=null){

                        this.right.iterate(arr);

                  }

         }

}

//创建一个完全二叉树的类 用来添加节点以及遍历节点

function CompleteTree(){

        this.root=null;

        this.add=function(value){

                if(this.root!=null){

                        nodeId = this.root.add(value);

                        this.root.fullup(nodeId);

                }else{

                        this.root = new Node(0,value);

                }

        }

        this.iterate=function(){

                arr = [];

                this.root.iterate(arr);

                return arr;

         }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,754评论 18 399
  • 二叉树是由一个根节点和根节点的左右指针指向的节点们构成的。 我们在做栈结构,队列结构,单向链表结构的节点删除时,都...
    Yossef阅读 1,252评论 0 1
  • 1.ajax
    Rosemarry丶阅读 194评论 0 0
  • 你知道雪花人是什么意思吗?不知道!和很多人一样,当我看到这本书时,我也纳闷。这是一个真实的故事,《雪花人》荣...
    何美珍阅读 521评论 0 2