您的位置:澳门金莎娱乐手机版 > 军事装备 > 数据结构:二叉树的链式存储,二叉树链式

数据结构:二叉树的链式存储,二叉树链式

发布时间:2019-12-29 05:07编辑:军事装备浏览(155)

    >EX-34链式美国

    >休斯EX34链式机枪美国 该枪是链式枪炮系列中口径最小的,主要装在装甲车或直升机上作同轴武器使用。由美国麦克唐纳·道格拉斯直升机公司及英国皇家军械公司生产。该枪目前已经装备在英国主战坦克、所有未来战斗车辆上及HGS55直升机上。另外加拿大、肯尼亚和哥伦比亚也有少量装备。结构特点研制历程使用情况结构特点

    lodash链式使用,lodash链式

    chain

    var _ = require('lodash');
    var user1 = {
     name: 'zhangsan',
     height: 180,
     weight: 120
    };
    var user2 = {
     name: 'lisi',
     height: 180,
     weight: 130
    };
    var user3 = {
     name: 'zhangsan',
     height: 180,
     weight: 131
    };
    
    var users = [user1, user2, user3];
    var result = _.chain(users).filter({name: 'zhangsan'}).uniq('name').pluck('weight').value();
    console.log(result);
    

    图片 1

     

    总结:lodash是一个能够帮助我们更方便的对数组进行各种操作的javascript工具库

    文档:  

    chain var _ = require('lodash');var user1 = {name: 'zhangsan',height: 180,weight: 120};var user2 = {name: 'lisi',height: 180,weight: 130};var user...

    数据结构:二叉树的链式存储,二叉树链式

    数据结构:二叉树的链式存储(C语言版)


     1.写在前面

      二叉树同样有两种存储方式,数组和链式存储,对于数组来说,我们利用二叉树的性质然后利用下标可以方便的找到一个节点的子节点和父节点。

      图片 2  

      图片 3

    二叉树的性质:
          1.二叉树的第i层上至多有2i-1个节点
          2.深度为K的二叉树至多有2k-1个节点
          3.任何一个二叉树中度数为2的节点的个数必度数为0的节点数目少1.
                说明:度数为0,为叶子节点。
          4.具有n个节点的完全二叉树的深度为|_Log2N_|+1
          5.若完全二叉树中的某节点编号为i,则若有左孩子编号为2i,若有右孩子编号为2i+1,母亲节点为i/2。
    

      结合第5条性质,可以在这种完全二叉树中十分方便的找到任何相关联(父子、兄弟等)的元素。

      但是由于顺序存储天生适配于完全二叉树,对于下面这种非完全二叉树并不合适,所以我们需要用到另一种存储方式——链式存储。

       

      

     

     

     

     

     

      在链式存储中,每个节点的结构如下

      

     

      一个存储数据的变量与两个指向孩子的指针域。
      利用指针域我们便可以完美的存储非完全二叉树,如下:

     

     

     

     

     

     

     

     

     

     

    2.代码分解

    ►首先根据上述图示,我们不难给出节点的描述

    typedef struct BiTNode
    {
        TElemType data;
        struct BiTNode *lchild,*rchild;
    }BiTNode,*BiTree;
    

    ►创建和遍历链式二叉树
        创建二叉树并不是十分容易的,因为它的创建方式也对应三种顺序,其实我认为二叉树的遍历和二叉树的创建可以说是几乎一样的过程。无非是创建的过程是给data赋值,遍历是取出data。
      我们先不给出创建的代码,而是要明白:

    说明:
      1.叶子节点不是没有左右孩子,只不过左右孩子都是空。
          2.我们在手动创建的过程中要根据层数来判断叶子节点左右空孩子的个数!
          3.创建和遍历的执行顺序是一样的,那么输入和取出的值才会是一样的。
    

      比如我们要先序创建一个上述图片中的二叉树,我们应该怎样输入呢?
        AB##CD##EF##G##

     # 在这里是表示叶子节点的左右节点为空。
    

      代码如下:

    void createBitree(Bitree &T)
    {
        char ch;
        if((ch=getchar())=='#')
            T=NULL;
        else
        {
            T=(Bitnode*)malloc(sizeof(Bitnode));
            T->data=ch;
            createBitree(T->Lchild);
            createBitree(T->Rchild);
        }
    }                
    

    ►遍历代码和创建代码基本一样:

    /*先序遍历*/
    void preTraverse(Bitree T)
    {
        if(T!=NULL)
        {
            printf("%c",T->data);
            preTraverse(T->Lchild);
            preTraverse(T->Rchild);
           }
    }
    
    /*中序遍历*/
    void  inorder(Bitree T)
    {
        if(T!=NULL)
        { 
            inorder(T->Lchild); 
            printf("%c",T->data);
            inorder(T->Rchild);
        } 
    }    
    
    /*后序遍历*/
    void  postorder(Bitree T)
    {
    
    if(T!=NULL)
    {
    postorder(T->lchild);
    postorder(T->rchild);
    printf("%c",T->data);
          }
    }
    

    ►我们输入字符后三种遍历情况如下:
      AB##CD##EF##G##
        ABCDEFG
        BADCFEG
        BDFGECA
    ►求二叉树的深度

    int   Depth(Bitree T)
    {//返回深度
        int d,dl,dr;
        if(!T)
            d=0;
        else {
            dl=Depth(T->Lchild);
            dr=Depth(T->Rchild);
            d=1+(dl>dr?dl:dr) ;
        }
    
        return d;
    }
    

     ►二叉树的层序遍历

        queue<Bitree> TreeQueue; //使用队列
        TreeQueue.push(tree);   //先将队头元素加入队列
        Bitree p = tree;    
        while (!TreeQueue.empty())  //循环判断队列是否未空,若不空则
        {
            p = TreeQueue.front();  //获取队列头节点,并出队列
            TreeQueue.pop();        
            printf(" %c ", p->data); //打印队列元素
    
            if (p->Lchild)     //如果该节点有左节点
            {
                TreeQueue.push(p->Lchild);  //加入队列
            } 
            if (p->Rchild)    //如果该节点有右节点
            {
                TreeQueue.push(p->Rchild); //加入队列
            }
        }
    

      |说明:

        1.算法轨迹:

          依旧使用下图:

        

     

     

     

     

     

     

     

      演示:
          我们首先将A加入队列, 此时对列 中只有    ⇐[A]
          我们将A出弹出队列,并将它的左右子树 BC加入队列,此时队列中有 ⇐[BC] ,打印出 A
          我们将B出弹出队列,它没有子树,我们不做任何操作,此时队列中有 ⇐[C] ,打印出 ABC
          我们将C出弹出队列,并将它的左右子树 DE加入队列,此时队列中有 ⇐[DE] ,打印出 ABC
          我们将D出弹出队列,它没有子树,我们不做任何操作,此时队列中有 ⇐[E] ,打印出 ABCD
          我们将E出弹出队列,并将它的左右子树 FG加入队列,此时队列中有 ⇐[FG] ,打印出 ABCDE
          我们将F出弹出队列,它没有子树,我们不做任何操作,此时队列中有 ⇐[G] ,打印出 ABCDEF
          我们将G出弹出队列,它没有子树,我们不做任何操作,此时队列中有 ⇐[null] ,打印出 ABCDEFG
      结论:
          根据轨迹我们不难发现,队列是保证层序遍历的基础,因为它保证了先加入队列的上层元素会必后加入队列的下层元素优先出队列。
    

        2.这段代码直接使用会出现问题,因为我们使用了C++标准模板库中的queue。所以,我们需要加入头文件

          #include<queue>,并且要使用命名空间 using namespace std;。

        3.我们对待数据结构最重要的是理解和使用,实现它只是帮助我们理解,我们无须重复造轮子,在以后的算法中,我们将尽可能的引用标准模板库。

     

    数据结构:二叉树的链式存储(C语言版) 1.写在前面 二叉树同样有两种存储方式,数组和链式...

    EX-34式7.62mm机枪是链式枪炮系列中口径最小的,主要装在装甲车或直升机上作同轴武器使用。该枪目前已经准备装在英国主战坦克和所有未来战斗车辆上,也装在HGS-55式直升机上。此外,加拿大、肯尼亚和哥伦比亚也有少量装备。

    该链式机枪的链条由电机驱动;闭锁突笋驱动枪栓头旋转并锁入枪管,枪机闭锁时,击针处于待发状态;马达上的动力制动器确保扳机松开后,枪栓将在开锁位置停止,因此没有卡壳的危险;弹链供弹也由马达驱动,但独立于枪机系统,因此可提供充足动力来控制长弹链,尤其在行驶于颠簸乡村路上的车辆中使用时;链式机枪尤其适合在坦克上使用,因为弹壳在控制下朝前抛出,而相对较长的枪机闭锁时间减少了排放到车辆内的烟雾;该枪采用近年来出现的一种新型作用原理,用于美国M2布莱德雷步兵战车时使用25毫米枪弹,而用于英国“勇士”步枪战车时使用7.62毫米枪弹。

    本文由澳门金莎娱乐手机版发布于军事装备,转载请注明出处:数据结构:二叉树的链式存储,二叉树链式

    关键词:

上一篇:没有了

下一篇:没有了