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

#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;
}
大量参考了资料书的代码!对非线性的数据结构还是不熟悉!
posted on 2015-01-27 12:12  赛亚人  阅读(182)  评论(0编辑  收藏  举报