• 树的链式存储结构


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

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

    #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
    ", BiTreeEmpty(T), BiTreeDepth(T));
        e1 = Root(T);
        printf("二叉树的根为: %c
    ", e1);
        printf("
    前序遍历二叉树:");
        PreOrderTraverse(T);
        printf("
    中序遍历二叉树:");
        InOrderTraverse(T);
        printf("
    后序遍历二叉树:");
        PostOrderTraverse(T);
        ClearBiTree(&T);
        printf("
    清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d
    ", BiTreeEmpty(T), BiTreeDepth(T));
        i = Root(T);
        if (!i)
            printf("树空,无根
    ");
    
    
        getchar();
        return 0;
    }
  • 相关阅读:
    剑指offer系列7--Fibonacci数列n项值
    剑指offer系列6--旋转数组的最小值
    剑指offer系列5---两个栈 模拟队列的操作
    剑指offer系列4---重建二叉树
    剑指offer系列3---二维数组查找
    java.security.MessageDigest的使用,MD5加密!
    自定义Android TabHost的背景及文字
    listview android:cacheColorHint,android:listSelector属性作用
    android设置背景平铺
    android4.0菜单显示不了图标、TabHost显示不了图片解决办法
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/10813934.html
Copyright © 2020-2023  润新知