二叉树

二叉树,每个结点⾄多只有2颗⼦树

二叉树示意图

结点的⾼度: 结点到叶⼦结点的最⻓路径(边数),  结点 -> 叶子结点

结点的深度: 根结点到这个结点所经历的边的个数, 结点 -> 根节点

结点的层数: 结点的深度-1

树的⾼度 : 根结点的⾼度

层序遍历:根结点开始访问,从上⽽下逐层遍历,在同⼀层中, 按从左到右的顺序对结点逐个访问

层序遍历

完全⼆叉树:结点 从上⽽下逐层,从左到右的顺序 都存在

完全⼆叉树&满二叉树

去掉3, 不是完全二叉树

去掉5, 不是满二叉树,是完全二叉树

完全二叉树,顺序结构储存具备下面特性, 结点从1开始编号

A.如果i>1,那么序号为i的结点的双亲结点序号为i/2; 

B.如果i=1,那么序号为i的结点为根节点,无双亲结点; 

C.如果2i<=n,那么序号为i的结点的左孩子结点序号为2i; 

D.如果2i>n,那么序号为i的结点无左孩子; 

E.如果2i+1<=n,那么序号为i的结点右孩子序号为2i+1; 

F.如果2i+1>n,那么序号为i的结点无右孩子。

G 有n个结点的完全二叉树深度为(log2(n))+1 

二叉树遍历

前序遍历:遍历顺序 根结点 -> 左⼦树 -> 右⼦树

前序遍历

中序遍历:遍历顺序 左⼦树 -> 根结点  -> 右⼦树

中序遍历

后序遍历:遍历顺序 左⼦树  -> 右⼦树 -> 根结点

后序遍历

遍历

遍历

二叉树创建代码实现

1.顺序结构

定义一个数组储存,长度是100

typedef CElemType SqBiTree[MAX_TREE_SIZE]; 

数据是根据 二叉树的层序遍历顺序得到的

Status CreateBiTree(SqBiTree T){

    int i =0;

    /*

     1      -->1

     2    3  -->2

     4  5  6  7 -->3

     8  9 10      -->4


     1 2 3 4 5 6 7 8 9 10 Nil Nil Nil

     */


    while(i <10) {

        T[i] = i+1;

        printf("%d ",T[i]);

        //结点不为空,且无双亲结点

        if(i !=0&& T[(i+1)/2-1] ==Nil&& T[i] !=Nil) {

            printf("出现无双亲的非根结点%d\n",T[i]);

            exit(ERROR);

        }

        i++;

    }

    //将空赋值给T的后面的结点

    while (i < MAX_TREE_SIZE) {

        T[i] =Nil;

        i++;

    }

    return OK;

}

获取二叉树的深度, 是一个完全二叉树,深度为(log2(n))+1 

int BiTreeDepth(SqBiTree T){

    int j = -1;

    int i;

    //找到最后一个结点

    //MAX_TREE_SIZE -> 100 -> 10 目的找到最后一个结点10的位置

    for(i =MAX_TREE_SIZE-1; i>=0; i--) {

        if(T[i] !=Nil)

            break;

    }

    do {

        j++;

    } while (powl(2, j) <= i);//计算2的次幂

    return j;

}

获取结点的双亲, 完全二叉树特性:i / 2

获取结点的左孩子:2i

获取结点的右孩子:2i + 1

获取结点的兄弟结点:i + 1  或 i - 1

前序遍历: 根结点 -> 左结点 -> 右结点

递归 完成

递归 入口

Status PreOrderTraverse(SqBiTree T){

    //树不为空

 if(!BiTreeEmpty(T)) {

        PreTraverse(T,0);

    }

    printf("\n");

 return OK;

}

void PreTraverse(SqBiTree T,int e){

    //打印结点数据  根结点

    visit(T[e]);

    //先序遍历左子树

    if(T[2* e +1] !=Nil) {

        左结点

        PreTraverse(T,2*e+1);

    }

    //最后先序遍历右子树

    if(T[2* e +2] !=Nil) {

      右结点

        PreTraverse(T,2*e+2);

    }

}

2. 链表结构

结点 结构体

typedef struct BiTNode  /* 结点结构 */

{

    CElemTypedata;        /* 结点数据 */

    structBiTNode*lchild,*rchild;/* 左右孩子指针 */

} BiTNode,*BiTree;

数据(前序遍历顺序) ABD##E#H#K##CFI###G#J##(# 空)

按前序输入二叉树中的结点值(字符),#表示空树

void CreateBiTree(BiTree *T){

    CElemType ch;

    //获取字符

    ch =str[indexs++];

    //判断当前字符是否为'#'

    if(ch =='#') {

        *T =NULL;

    }else {

        //创建新的结点

        *T = (BiTree)malloc(sizeof(BiTNode));

        //是否创建成功

        if(!*T) {

            exit(OVERFLOW);

        }

        /* 生成根结点 */

        (*T)->data= ch;

        /* 构造左子树 */

        CreateBiTree(&(*T)->lchild);

        /* 构造右子树 */

        CreateBiTree(&(*T)->rchild);

    }

}

二叉树T的深度 不懂(代码断点调试)

int BiTreeDepth(BiTree T){

    int i,j;

    if(!T)

        return 0;

    //计算左孩子的深度

    if(T->lchild)

        i=BiTreeDepth(T->lchild);

    else

        i=0;

    //计算右孩子的深度

    if(T->rchild)

        j=BiTreeDepth(T->rchild);

    else

        j=0;

    //比较i和j

    return i>j?i+1:j+1;

}

前序遍历 递归完成

void PreOrderTraverse(BiTree T)

{

    if(T==NULL)

        return;

    printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */

    PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */

    PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */

}

线索二叉树, 结点的左结点或右结点为空的话,赋值 当前结点的前驱或后继

创建一个虚拟头结点

线索二叉树

中序遍历

Link==0表示指向左右孩子指针

Thread==1表示指向前驱或后继的线索

typedef enum {Link,Thread} PointerTag;

线索二叉树存储结点结构

typedef struct BiThrNode{

    //数据

    CElemType data;

    //左右孩子指针

    struct BiThrNode *lchild, *rchild;

    //左右标记

    PointerTag LTag;

    PointerTag RTag;

} BiThrNode, *BiThrTree;

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

推荐阅读更多精彩内容