6树--大话数据结构

先去看视频的笔记[树](https://www.jianshu.com/p/551f7c111207

1.定义

树是n(n>= 0)个节点的有限集,n = 0时称为空树,在任意一颗非空树中:(1)有且仅有一个特定的称为根的节点
(2)当n > 1时,其余结点可分为m(m> 0)个互不相交的有限集T1、T2、 ..... Tm,其中每一个集合本身又是一棵树,并且称为根的子树

2.二叉树的性质

2.1在二叉树的第i层至多有2的i - 1次方个结点

2.2深度为k的二叉树至多有2的k次方 -1个结点

2.3对任意一棵二叉树T,如果其终端结点数为n0,度为2的节点数为n2,则n0 = n2+1。

2.4具有n个结点的完全二叉树的深度为[log 2 n] + 1;

2.5如果对一棵有n个结点的完全二叉树(其深度为[log 2 n] + 1)的结点按层序编号(从第一次到第[log 2 n] + 1层,每层从左到右),对任一结点 i ,(1<= i <= n)有
2.5.1如果i = 1,则结点i 是二叉树的根,无双亲,如果i > 1,则其双亲是结点 [i / 2]
2.5.2如果 2i > n,则结点i 无左孩子(结点i 为叶子结点);否则其左孩子是结点2i;
2.5.3 如果 2i+ 1 > n,则结点i 无右孩子,否则其右孩子是结点2i + 1;

3二叉树的建立

/*  按前序输入二叉树中结点的值(一个字符) #表示空树,构造二叉链表表示二叉树T*/
void CreateBiTree(BiTree *T){

      TElemType ch;
      scanf("%c",&ch);
      if(ch == '#')
            *T = NULL;
      else{
           *T = (BiTree) malloc(sizeof(BiTNode));
            if(!*T)
                  exit(-1);
             (*T)->data = ch;
              CreateBiTree(&(*T)->lchild);
              CreateBiTree(&(*T)->rchild);
      }
}

4.线索二叉树

我们把指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树
7b96cc6a3a6f70b3a88f2d68ad39855.jpg

10b241c647abd9b1bca04b8227cc1a6.jpg

实现

typedef enum {Link,Thread} PointerTag; //当Link == 0时表示指向左右孩子指针
//Thread == 1 表示指向前驱或后继的线索

typedef struct BiThrNode{
        TElemType data;
        struct BiThrNode *lchild,*rchild;
        PointerTag LTag;
        PointerTag RTag;
}BiThrNode,*BiThrTree;

中序遍历进行中序线索化

BiThrTree pre;// 全局变量 ,始终指向刚刚访过的结点
void InThreading(BiThrTree p){
    if(p){
          InThreading(p->lchild);
          if(!p->lchild){
              p->LTag = Thread;
              p->lchild = pre;
          }
          if(!pre -> rchild){
              pre->RTag = Thread;
              pre->rchild = p;
          }
          
          pre = p;
          InThreading(p->rchild);
    }
}

遍历代码

/*  T指向头结点,头结点左链lchild 指向根结点,头结点右链rchild指向中序遍历的*/
// 最后一个结点,中序遍历二叉线索链表表示的二叉树T
Status InOrderTraverse_Thr(BiThrTree T){
    BiThrTree p;
    p = T->lchild; // p 指向根结点
    while(p != T){ // 空树或遍历结束时,p == T
        while(p->LTag == Link) // 当LTag == 0时循环到中序序列第一个结点
                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;
}

5.树、森林与二叉树的转换

5.1 树转换为二叉树步骤
5.1.1加线,在所有兄弟结点加一条连线
5.1.2去线,对树中每一个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线
5.1.3层次调整,以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构分明(其实就是把它摊开)

4715b3d7fa61645e39431a093031e0e.jpg

5.2森林转换为二叉树
5.2.1把每棵树转换为二叉树
5.2.2第一棵树不动,从第二棵二叉树开始,依次把后一棵树的根节点作为前一棵树的根节点的右节点,用线连接起来后就是二叉树


f80e38ffb83566ddc976b72a0044f54.jpg

]

5.3二叉树转换为树
5.3.1加线,就是左孩子的n个右孩子结点都作为此节点的孩子,用线连接起来
5.3.2去线,删除原二叉树中国所有结点与其右孩子结点的连线
5.3.3层次调整


f80e38ffb83566ddc976b72a0044f54.jpg

5.4二叉树转换为森林
5.4.1 从根节点开始,若右孩子存在,则把与右孩子结点的连线删除,在查看分离后的二叉树,若右孩子存在,则连线删除
5.4.2再将每棵分离后的二叉树转换为树即可!!


e6e7706608bdc9a9b653a54e245ec87.jpg

6树和森林的遍历

6.1树的遍历
1.先根遍历树,先访问树的根结点,然后依次先先根遍历根的每棵子树(二叉树的前序遍历)
2.后根遍历,(二叉树的中序遍历)

6.2森林的遍历
1.前序遍历:(二叉树的前序遍历)
2.后序遍历:(二叉树的中序遍历)

7赫夫曼树及其应用

带权路径长度WPL最小的二叉树称为赫夫曼树
权:即为百分比

应用:用于压缩,通过重新编码,减少占用的存储空间

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容