来源:互联网 发布:python黑帽子 百度云 编辑:程序博客网 时间:2024/05/17 07:13
2017年5月25日 16:45:10
 


度:结点拥有的子树数成为结点的度

深度/高度:树中结点的最大层次
    如果将书中结点的各子树看成从左到右是有次序的,不能互换的,则称该树为有序树

树的表示方法:
    (1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置
    (2)孩子表示法:把每个结点的孩子结点排列起来,以单链表做存储结构,则n个结点
                     有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又
                     组成一个线性表,采用顺序存储结构,存放一个一维数组中
            每个结点有多个指针域,其中每个指针指向一颗子树的根节点
            因为每个结点的度不同,因此孩子个数不同,有两种方法解决
            1.指针域的个数等于树的深度。这样会使很多指针域为NULL
            2.每个结点指针域的个数等于结点的度。但是各个结点的链表是不相同的结构,
              加上要维护结点度的数值,在运算上就会带来时间上的损耗
    (3)双亲孩子表示法
    (4)孩子兄弟表示法:任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右
                        兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该
                        结点的第一个孩子和此结点的右兄弟。
                        最大的好处:将一颗复杂的树变成了一颗二叉树

二叉树的特点:
    1.每个结点最多有两棵子树
    2.左子树和右子树是有顺序的,次序不能任意颠倒
    3.即使树中某结点只有一棵子树,也要区分它是左子树还是右子树

特殊的二叉树:
    1.斜树:所有的结点都只有左子树,叫左斜树,同理还有右斜树
    2.满二叉树:所有结点都存在左子树和右子树,并且所有叶子都在同一层上
    3.完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i的结点与同样深度的满
                  二叉树中编号为i的结点在二叉树中的位置完全相同,则成为完全二叉树

        特点:(1)叶子结点只能出现在最下两层
              (2)最下层的叶子一定集中在左部连续位置
              (3)倒数两层,若有叶子结点,一定都在右部连续位置
              (4)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况
              (5)同样结点树的二叉树,完全二叉树的深度最小

二叉树的性质:
    1.在二叉树的第i层上至多有2^(i-1)个结点
    2.深度为k的二叉树至多有2^k-1个结点
    3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点树为n2,则n0 = n2 + 1
    4.具有n个结点的完全二叉树的深度为[logn]+1
    5.如果对一棵有n个几点的完全二叉树的结点按层序编号,对任一结点i:
            (1)如果i = 1,则结点i是二叉树的根,无双亲;如果 i > 1,则其双亲是结点[i / 2]
            (2)如果2i > n, 则结点i无左孩子,否则其左孩子是结点2i
            (3)如果2i + 1 > n,则结点i无右孩子;否则其右孩子是结点2i + 1

线索二叉树:
    指向前驱和后继的指针成为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树

    后继:下一个要读取的结点。        前驱:上一个读取的结点

    线索化:对二叉树以某种次序遍历使其变为线索二叉树的过程

    在每个结点增加两个标志位,分别表明:结点的lchild是指向左孩子还是前驱,rchild是指向右孩子还是后继

    中序遍历线索化的递归函数代码:

    BiThrTree pre;    //全局变量,始终指向刚刚访问过的结点
    void InThreading(BiThrTree p)
    {
        if(p)
        {
            InThreading(p->lchild);

            if(!p->lchild)
            {
                p->LTag = Thread;
                p->lchild = pre;
            }

            if(! p->rchild)
            {
                p->RTag = Thread;
                p->rchild = p;               
            }

            pre = p;

            InThreading(p->rchild);
        }
    }

    遍历的代码:
    //这里是有头结点的二叉树,头结点的左子树为根节点
    Status InOrderTraveres_Thr(BiThrTree T)
    {
        BiThrTree p;
        p = T->lchild;
        while( p != T)
        {
            while(p->LTag == Link)    //有左孩子,无前驱时,循环到中序序列的第一个结点
            {
                p = p->lchild;
            }

            printf("%c",p->data);

            while(p->RTag == Thread && p->rchild != T)    //有后继,切不是头
            {
                p = p->rchild;
                printf("%c",p->data);               
            }

            p = p->rchild;
        }

        return OK;
    }



赫夫曼树:
    从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称为路径长度

    树的路径长度就是从树根到每一个结点的路径长度之和

    带路径长度WPL最小二叉树成为赫夫曼树,即最优二叉树

    赫夫曼算法:
        1.根据给定的n个权值{w1,w2...}构成n棵二叉树的集合 F = {T1,T2...},其中每颗二叉树Ti
          中只有一个带权为wi根节点,其左右子树均为空
        2.在F中选取两科根节点的权值最小的树作为左右子树构成一棵新的二叉树,且置新的二叉树的根
          结点的权值为其左右子树上根结点的权值之和
        3.在F中删除这两棵树,同时将新得到的二叉树加入F中
        4.重复2和3步骤,直到F只含一棵树为止
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 英雄联盟画面卡顿怎么办 长残了怎么办原来很帅 被吓到了怎么办没精神 宝宝吓着怎么办最有效 4个月婴儿易惊吓怎么办 心里有问题的人怎么办 减肥的时候想吃东西怎么办 大联盟ping很高怎么办 酷派手机弹广告怎么办 孕早期肚子紧绷怎么办 怀孕2个月同房了怎么办 怀孕前三月同房了怎么办 人流前三天同房了怎么办 人流后三天同房了怎么办 吃避孕药后月经量少怎么办 排卵日同房不想怀孕怎么办 排卵日同房没有怀孕怎么办 想怀孕想生儿子怎么办 到期大姨妈不来怎么办 怕怀孕月经不来怎么办 宫颈环扎后宫缩怎么办 来例假刺激外阴高潮了怎么办 客人消费完说没钱怎么办? 孕13周血糖偏高怎么办 餐后血糖高14点怎么办 餐后血糖20多怎么办 空腹血糖6.6饭后9.2怎么办 键盘shift键失效了怎么办 灵异附身夫妻不合怎么办 鞋子买大了半码怎么办 鞋子买小了半码怎么办 黑布鞋鞋面白了怎么办 黑布鞋不黑了怎么办 黑布鞋退白了怎么办 老北京布鞋款式太少怎么办 老人输液抽搐后昏迷怎么办 头七家里有狗怎么办 股票退市股民的钱怎么办 美国股票退市股民怎么办 百度云字幕和视频不同步怎么办 百度云加载字幕有延迟怎么办