C语言描述-二叉树链式存储

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef char TElemType;

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

/*构建二叉树*/
void CreateBiTree(BiTree *T)
{
    TElemType e;
    
    if ((e=getchar()) == '#')
    {
        *T = NULL;
    }
    else
    {
        *T = (BiTree) malloc(sizeof(BiTNode));
        if (!T)
        {
            exit(0);
        }
        (*T)->data = e;
        CreateBiTree(&(*T)->lchild);    //创建左子树
        CreateBiTree(&(*T)->rchild);    //创建右子树
    }
}

/*先序遍历*/
void PreOrderTraverse(BiTree T)
{
    if (T)
    {
        printf("%c ",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
    
}

/*中序遍历*/
void InOrderTraverse(BiTree T)
{
    if (T)
    {
        InOrderTraverse(T->lchild);
        printf("%c ",T->data);
        InOrderTraverse(T->rchild);
    }
}

/*后序遍历*/
void PostOrderTraverse(BiTree T)
{
    if (T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%c ",T->data);
    }
}

/*求结点总数*/
int count(BiTree T)
{
    int sum=0;
    if(T==NULL)
        sum = 0;
    else
        sum = 1+count(T->lchild)+count(T->rchild);
    return sum;
}

/*求叶子结点数*/
int count_leaf(BiTree T)
{
    int sum=0;
    if(T==NULL)
    {
        sum=0;
    }
    else if(T->lchild==NULL&&T->rchild==NULL)
    {
        sum=1;
    }
    else
    sum=count_leaf(T->lchild)+count_leaf(T->rchild);
    return sum;
}

/*求深度*/
int Depth(BiTree T)
{
    if(T==NULL)
        return 0;
    int left=Depth(T->lchild)+1;
    int right=Depth(T->rchild)+1;
    return left>right?left:right;
}

int main()
{
    BiTree T;
    int sum_all=0,sum_leaf=0,depth=0;
    printf("请输入元素,#表示空树:\n");
    CreateBiTree(&T);
    printf("先序遍历:");
    PreOrderTraverse(T);
    printf("\n中序遍历:");
    InOrderTraverse(T);
    printf("\n后序遍历:");
    PostOrderTraverse(T);
    printf("\n");
    sum_all=count(T);
    printf("总结点数:%d\n",sum_all);
    sum_leaf=count_leaf(T);
    printf("叶子结点数:%d\n",sum_leaf);
    depth=Depth(T);
    printf("深度:%d\n",depth);
    return 0;
}
/* 测试
请输入元素,#表示空树:
AB##CD##EF##G##
先序遍历:A B C D E F G 
中序遍历:B A D C F E G 
后序遍历:B D F G E C A 
总结点数:7
叶子结点数:4
深度:4
Program ended with exit code: 0
*/
posted @ 2019-10-26 20:29  翁德彪  阅读(714)  评论(0编辑  收藏  举报