树的链式存储结构

今天周末,无聊了,咱们观察下树怎么从枝杈长成参天大树吧!

首先,得把树杈栽入土中,我们先看一下土壤吧!

#include "stdio.h"
#include "stdlib.h"
#include "string"
#include "math.h"
#include "io.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 100

typedef int Status;

typedef char TElemType;
TElemType Ni1 = ' ';

土壤咱们选择完了,于是咱们就幻想树长大了,有各种各样的树叶,那一片一片的树叶脉络,真棒!

int index = 1;
typedef char String[24];
String str;

Status StrAssign(String T, char* chars)
{
    int i;
    if (strlen(chars) > MAXSIZE)
        return ERROR;
    else
    {
        T[0] = strlen(chars);
        for (i = 1; i <=T[0]; i++)
            T[i] = *(chars + i - 1);
        return OK;
    }
}

还有那各种各样的树杈,也很不错!

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

但,咱们现在没有树杈,手里空空

Status InitBiTree(BiTree *T)
{ 
    *T=NULL;
    return OK;
}

于是,咱们去买赶紧栽种吧!终于种完了,于是每天给他浇水,期待着它慢慢的长大,终于他长大了,长了各种各样的树枝

void CreateBiTree(BiTree *T)
{ 
    TElemType ch;
    
    /* scanf("%c",&ch); */
    ch=str[index++];

    if(ch=='#') 
        *T=NULL;
    else
    {
        *T=(BiTree)malloc(sizeof(BiTNode));
        if(!*T)
            exit(OVERFLOW);
        (*T)->data=ch; /* 生成根结点 */
        CreateBiTree(&(*T)->lchild); /* 构造左子树 */
        CreateBiTree(&(*T)->rchild); /* 构造右子树 */
    }
 }

树长大了,但是它结了几层的树杈啊,咱们还是数一数吧!

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;
    return 1 + i > j ? i : j;
}

树长得太大了,树根都冒出花盆外了,明显可以看到树根了

TElemType Root(BiTree T)
{
    if (T)
        return T->data;
    else return Ni1;
}

我的天,这片树叶真好看啊,不信你看一看

TElemType Value(BiTree p)
{
    return p->data;
}

妹妹,你往树叶上瞎涂什么啊!你看看被你涂成什么样子了?

void Assign(BiTree p, TElemType value)
{
    p->data = value;
}

妹妹突然被我这么一吼,吓坏了,于是就哭了,哎,早知这样,我就不吼了,还得哄!

“妹妹啊!别哭哈!咱们一起数叶子吧,咱们先从上往下面数吧”(前序)

void PreOrderTraverse(BiTree T)
{
    if (T==NULL) return;
    printf("%c", T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

“咱们从上往下数完,咱们就从左往右数吧!”(中序)

void InOrderTraverse(BiTree T)
{
    if (T == NULL) return;
    InOrderTraverse(T->lchild);
    printf("%c", T->data);
    InOrderTraverse(T->rchild);
}

“这回,咱们从下往上数吧”(后序)

void PostOrderTraverse(BiTree T)
{
    if (T == NULL) return;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c", T->data);
}

随着一天一天过去,到了秋天,树叶黄了,于是变成了落叶

void DestroyBiTree(BiTree *T)
{
    if (*T)
    {
        if ((*T)->lchild)
            DestroyBiTree(&(*T)->lchild);
        if ((*T)->rchild)
            DestroyBiTree(&(*T)->rchild);
        free(*T);
        *T = NULL;
    }
}
#define ClearBiTree DestroyBiTree

树的成长我已经拍下来了,你们可以自己看一下吧!

int main()
{
    int i;
    BiTree T;
    TElemType e1;
    InitBiTree(&T);


    StrAssign(str, "ABDH#K###E##CFI###G#J##");

    CreateBiTree(&T);

    printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", BiTreeEmpty(T), BiTreeDepth(T));
    e1 = Root(T);
    printf("二叉树的根为: %c\n", e1);
    printf("\n前序遍历二叉树:");
    PreOrderTraverse(T);
    printf("\n中序遍历二叉树:");
    InOrderTraverse(T);
    printf("\n后序遍历二叉树:");
    PostOrderTraverse(T);
    ClearBiTree(&T);
    printf("\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", BiTreeEmpty(T), BiTreeDepth(T));
    i = Root(T);
    if (!i)
        printf("树空,无根\n");


    getchar();
    return 0;
}

 

posted @ 2019-05-05 16:52  追风的小蚂蚁  阅读(621)  评论(0编辑  收藏  举报