数据结构—二叉树(C语言实现)

以下所有内容来自网易云课堂——数据结构(小甲鱼版)


对于树来说,一旦可以指明他的分支数,那么就可以用链表来实现了

二叉树是应用广泛的树,因为现实世界大部分模型都只包含0,1这两种情况,非常适合用二叉树


如下:

typedef struct BiNode
{
    char content ;
    struct BiNode *left;
    struct BiNode *right;
}BiNode,*BiTree;

其实就是使用了两个指针的链表


OK,那如何创建二叉树呢?要先明白二叉树的遍历分为前序,中序,后序三种,现在还不太清楚的同学可以去视频里面去学一下

这里只给出按照前序创建的方式(网上说只有前序和后序可以,中序不可以,没有太思考明白为什么,如果有懂的朋友,还是希望可以教教我)

以下是一种递归的创建方式

void CreateBiTree(BiTree *T)
{
    char receive ;
    scanf("%c",&receive);
    if(receive == '*')
    {
       *T = NULL ;
    }
    else
    {
        *T = (BiTree)malloc(sizeof(BiNode));
        (*T)->content = receive ;
        CreateBiTree(&(*T)->left);
        CreateBiTree(&(*T)->right);
    }
}

先按照前序遍历输入二叉树,如果是空的位置输入“*”

他的思路是这样的

假设现在一个公司分苹果,左子树是下属主领导,右子树是下属副领导,好吧,当然是主领导比副领导优先

那么他们的规律是:

老大A拿了一个,给下属主领导B打电话“来拿苹果,拿完告诉我,我再给副领导C打”

主领导B拿完,给自己的下属主领导D打电话“来拿苹果,拿完告诉我,我再给副领导E打”

...

如果自己是最底层小弟(*号表示),只能说不客气,告诉上级

自己的小弟都拿完了,那么就说我和我手下都拿完了,告诉上级

...

(可以理解成从高往低一级一级的部署任务,然后从低往高一级一级的汇报,对于每一层,无非是

自己工作,让小弟(左)工作,让小弟(右)工作,然后完成)


对应于安排任务的相应遍历方式

#define FRONT 1
#define MIDDLE 2
#define BACK 3

// .....

void show(BiTree *T,int TYPE)
{
    if(*T==NULL)
    {
        printf("*");
        return ;
    }
    else
    {
        switch(TYPE)
        {
            ///////just change the order
            case FRONT:
                    printf("%c",(*T)->content);
                    show(&(*T)->left,TYPE);
                    show(&(*T)->right,TYPE);
                    break;
            case MIDDLE:
                    show(&(*T)->left,TYPE);
                    printf("%c",(*T)->content);
                    show(&(*T)->right,TYPE);
                    break;
           case BACK:
                    show(&(*T)->left,TYPE);
                    show(&(*T)->right,TYPE);
                    printf("%c",(*T)->content);
                    break;
        }
        return ;
    }
}


注意看switch处的三种方式,是不是只是次序变了一下!

其实二叉树的遍历就是这样!。


结合遍历去看前序创建,你是不是发现这里的代码其实非常的形象?这就是递归大法的好处!

休息了

猜你喜欢

转载自blog.csdn.net/emiedon/article/details/51964934