【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)

最近小菜鸟西瓜莹看到了一道面试题:

  给定二叉树,按层打印。例如1的子节点是2、3, 2的子节点是3、4, 5的子节点是6,7.

  需要建立如图二叉树:

  但是西瓜莹找到的相关代码都是用js构建最优二叉树,假如,依次向二叉树中添加4,2,6,1,3,5,7最优二叉树如图:

  比根节点小的节点总是放在根节点的左节点上,比根节点大的节点总是放在根节点的右节点上。

  假如想依次向二叉树添加1,2,3,4,5,6,7 二叉树又是如何呢?

  后一个数据总是比前一个数据大,那么就会一直在根节点的右节点上。

  构建最优二叉树的核心就是添加节点的函数,记录当前节点,如果新数据比当前节点小,则让新数据成为左节点。否则成为右节点。

  代码如下:

function addNode(ele){
    var n = new Node(ele, null, null);
    var Que = [];
    if(this.root == null)
    {
        this.root = n;
    }
    else {
            var curr = this.root;
            var parent;
             while(true)
             {
                 parent = curr;
                 if(ele<curr.element)
                 {
                     curr = curr.left;
                     if( curr == null)
                     {
                     parent.left = n;
                     break;
                     }
                 }
                 else{
                     curr = curr.right;
                     if(curr == null)
                     {
                         parent.right = n;
                         break;
                     }
                 }
             }

         }

    }

}

  可是目的并不是创建最优二叉树,而是创建1,2,3,4,5,6,7这样的二叉树,那么如何实现呢?

  思路:用一个队列来存储节点,将根节点放入队列中,如果根节点既有左节点又有右节点,将左右节点放入队列,如果没有左节点,将新数据放在左节点上,如果没有右节点,就将新数据放在右节点上。

  代码:

function addNode(ele){
    var n = new Node(ele, null, null);
    var Que = [];
    if(this.root == null)
    {
        this.root = n;
    }
    else {
        var curr = this.root;
        Que.push(curr);
    }
    while(Que.length>0)
    {
        curr = Que.shift();
        if(curr.left != null && curr.right != null)
        {
            Que.push(curr.left);
            Que.push(curr.right);
        }
        else if(curr.left == null )
        {
            curr.left = n;
            break;
        }
        else if(curr.right == null)
        {
            curr.right = n;
            break;
        }
    }

} 

  

  

 二叉树的遍历

  层次遍历也采用队列思想:

function showLevel(node)
{
    var queue = [];
    var curr;
    if(this.root != null)
    {
        queue.push(this.root)
    }
    while(queue.length>0)
    {
        curr = queue.shift();
        console.info(curr.element)
        if(curr.left != null && curr.right != null)
        {
            queue.push(curr.left);
            queue.push(curr.right);
        }
        else if(curr.left == null )
        {
            continue;
        }
        else if(curr.right == null)
        {
            queue.push(curr.left);
            continue;
        }
    }
}

 执行结果:

 

  

  先序遍历:

function showTree(node){
    if(!(node == null))
    {
        node.show();
        showTree(node.left);
        showTree(node.right);
    }
}

  运行结果:

  

完整代码:

function Node(ele, left, right){
    this.element = ele;
    this.left = left;
    this.right  = right;
    this.show = show;
}
function show(){
    console.log(this.element);
}
function BinaryTree(){
    this.root = null;
    this.addNode = addNode;
    this.showTree = showTree;
    this.showLevel = showLevel;
}

function addNode(ele){
    var n = new Node(ele, null, null);
    var Que = [];
    if(this.root == null)
    {
        this.root = n;
    }
    else {
        var curr = this.root;
        Que.push(curr);
    }
    while(Que.length>0)
    {
        curr = Que.shift();
        if(curr.left != null && curr.right != null)
        {
            Que.push(curr.left);
            Que.push(curr.right);
        }
        else if(curr.left == null )
        {
            curr.left = n;
            break;
        }
        else if(curr.right == null)
        {
            curr.right = n;
            break;
        }
    }

}

function showTree(node){
    if(!(node == null))
    {
        node.show();
        showTree(node.left);
        showTree(node.right);
    }
}

function showLevel(node)
{
    var queue = [];
    var curr;
    if(this.root != null)
    {
        queue.push(this.root)
    }
    while(queue.length>0)
    {
        curr = queue.shift();
        console.info(curr.element)
        if(curr.left != null && curr.right != null)
        {
            queue.push(curr.left);
            queue.push(curr.right);
        }
        else if(curr.left == null )
        {
            continue;
        }
        else if(curr.right == null)
        {
            queue.push(curr.left);
            continue;
        }
    }
}

var Tree = new BinaryTree();
Tree.addNode(1)
Tree.addNode(2)
Tree.addNode(3)
Tree.addNode(4)
Tree.addNode(5)
Tree.addNode(6)
Tree.addNode(7)
showTree(Tree.root)
Tree.showLevel(Tree.root)

 

  这样,我们就构建了一个二叉树:

时间: 2024-08-02 07:03:35

【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)的相关文章

(转)数据结构:树、二叉树、最优二叉树

来源:http://www.cnblogs.com/coder2012/archive/2013/06/05/3102868.html 树 树形结构是一类非常重要的非线性结构,它可以很好地描述客观世界中广泛存在的具有分支关系或层次特性的对象,因此在计算机领域里有着广泛应用,如操作系统中的文件管理.编译程序中的语法结构和数据库系统信息组织形式等. 树的相关定义 节点的度:一个节点含有的子树的个数称为该节点的度: 树的度:一棵树中,最大的节点的度称为树的度: 叶节点或终端节点:度为零的节点: 非终端

最优二叉树

树的路径长度 树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 树的带权路径长度(weighted path length of tree,wpl) 结点的权值:在一些应用中,赋予树中结点的一个有某种意义的实数. 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积 树的带权路径长度(wpl):定义为树中所有结点的带权路径长度之和 最优二叉树 在权为w1,w2,...,wn的n个叶子结点所构成的所有二叉树中,带权路径长度最小(即代价

构造最优二叉树-赫夫曼(Huffman)树算法

一.基本概念 1.赫夫曼(Huffman)树又称最优二叉树或最优搜索树,是一种带权路径长度最短的二叉树.在许多应用中,常常赋给树中结点一个有某种意义的实数,称此实数为该结点的权.从树根结点到该结点之间的路径长度与该结点上权的乘积称为结点的带权路径长度(WPL),树中所有叶子结点的带权路径长度之和称为该树的带权路径长度,通常记为: 2.两结点间的路径:从一结点到另一结点所经过的结点序列;路径长度:从根结点到相应结点路径上的分支数目;树的路径长度:从根到每一结点的路径长度之和. 3.深度为k,结点数

最优二叉树(霍夫曼树)分析

 1.树的路径长度     树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 2.树的带权路径长度(Weighted Path Length of Tree,简记为WPL) 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数. 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积. 树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和,通常记为: 其中: n

Data Structure 之 最优二叉树

给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长 度为L-1. 2.结点的权及带权路径长度 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权.结点的带权路径

树和二叉树-&gt;最优二叉树

文字描述 结点的路径长度 从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称作路径长度. 树的路径长度 从树根到每一个结点的路径长度之和叫树的路径长度. 结点的带权路径长度 从该结点到树根之间的路径长度与结点上权的乘积 树的带权路径长度 所有叶子结点的带权路径长度之和 最优二叉树或哈夫曼树 假设有n个权值{w1,w2, - ,wn},试构造一颗有n个叶子结点的二叉树,每个叶子结点带权wi,则其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树. 哈夫曼算法 目

数据结构之Huffman树与最优二叉树

最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式,使用huffman编码方式,我们可以以平均长度最短的码字来记录一串信息,且每个信息分子的编码唯一,独立.从而最终合成编码所对应的信息唯一,无歧义. huffman树的创建时基于每个信息分子都拥有其权重,权重越大,越靠近树根,即路径越短, 下面我们我们来以一个huffman树的例子为例:简单引入一下

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

JS数据结构第三篇---双向链表和循环链表

一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地址.然后头结点的上一个节点,和尾结点的下一个节点都指向null.同时LinkedList类中再增加一个last内部属性,一直指向链表中最后一个节点.结构模拟如图: 同样对外暴露的方法和单向链表一样,只是内部实现稍有变化 双向链表完整设计代码: /** * 自定义双向链表:对外公开的方法有 * append(e