数据结构实验十一——树的基本操作

来源:互联网 发布:wifi网络密码破解 编辑:程序博客网 时间:2024/06/05 02:57
#include <stdio.h>#include <stdlib.h>typedef struct BiNode{    char data;    struct BiNode *lchild,*rchild;}BiNode,*BiTree;void CreateTree(BiTree *T)//输入有技巧!!{    char ch;    scanf("%c",&ch);    if(ch==' ')        *T=NULL;    else    {        *T=(BiTree)malloc(sizeof(BiNode));        (*T)->data=ch;        CreateTree(&(*T)->lchild);        CreateTree(&(*T)->rchild);    }}void PreDisplay(BiTree T){    if(T)    {        printf("%c",T->data);        PreDisplay(T->lchild);        PreDisplay(T->rchild);    }}void InDisplay(BiTree T){    if(T)    {        InDisplay(T->lchild);        printf("%c",T->data);        InDisplay(T->rchild);    }}void PostDisplay(BiTree T){    if(T)    {        PostDisplay(T->lchild);        PostDisplay(T->rchild);        printf("%c",T->data);    }}void Display(BiTree T){    if(T)    {        printf("%c",T->data);        if(T->lchild!=NULL||T->rchild!=NULL)        {            printf("(");            if(T->lchild!=NULL)                Display(T->lchild);            printf(",");            if(T->rchild!=NULL)                Display(T->rchild);            printf(")");        }    }}int NodeNum(BiTree T){    if(T==NULL) return 0;    else if(T->lchild==NULL&&T->rchild==NULL) return 1;    else return NodeNum(T->lchild)+NodeNum(T->rchild)+1;}int LeafNodeNum(BiTree T){    if(T==NULL) return 0;    else if(T->lchild==NULL&&T->rchild==NULL) return 1;    else return LeafNodeNum(T->lchild)+LeafNodeNum(T->rchild);}int DeepthTree(BiTree T){    if(T==NULL) return 0;    else if(DeepthTree(T->lchild)>DeepthTree(T->rchild))        return 1+DeepthTree(T->lchild);    else        return 1+DeepthTree(T->rchild);}BiTree FindNode(BiTree T,char e){    BiTree p;    if(T==NULL){        printf("tree empty!\n");        return NULL;    }    else if(T->data==e)        return T;    else    {        p=FindNode(T->lchild,e);        if(p!=NULL)            return p;        else            return FindNode(T->rchild,e);    }}void Display2(BiTree T){    BiTree S[20],p;    int level[100][2],top=-1,n,i;    char e;    if(T)    {        top++;        S[top]=T;        level[top][0]=1;        level[top][1]=2;        while(top>-1)        {            p=S[top];            n=level[top][0];            switch(level[top][1])            {            case 0:                e='L';                break;            case 1:                e='R';                break;            case 2:                e='B';                break;            }            for(i=0;i<n;i++)                printf(" ");            printf("%c(%c)",p->data,e);            for(i=n+1;i<40;i+=2)                printf("--");            printf("\n");            top--;            if(p->rchild!=NULL)            {                top++;                S[top]=p->rchild;                level[top][1]=1;                level[top][0]+=4;            }            if(p->lchild!=NULL)            {                top++;                S[top]=p->lchild;                level[top][1]=0;                level[top][0]+=4;            }        }    }}int main(){    BiTree T;    printf("请按先序遍历依次输入二叉树:\n");    CreateTree(&T);    printf("二叉树的先序遍历是:\n");    PreDisplay(T);    printf("\n");    printf("二叉树的中序遍历是:\n");    InDisplay(T);    printf("\n");    printf("二叉树的后序遍历是:\n");    PostDisplay(T);    printf("\n");    printf("二叉树的广义表输出:\n");    Display(T);    printf("\n");    printf("二叉树的凹形输出:\n");    Display2(T);    printf("\n");    printf("二叉树T是%s\n",(T==NULL)?"empty tree":"no empty tree");    printf("二叉树T的节点个数=%d\n",NodeNum(T));    printf("二叉树T的叶子节点个数=%d\n",LeafNodeNum(T));    printf("二叉树T的深度=%d\n",DeepthTree(T));    return 0;}
大量参考了资料书的代码!对非线性的数据结构还是不熟悉!
0 0
原创粉丝点击