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

本文详细介绍了二叉树的基本概念、操作方法,并通过C语言实例展示了如何创建、遍历、显示二叉树,包括先序、中序、后序遍历,以及广义表输出和凹形输出。
#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;
}
大量参考了资料书的代码!对非线性的数据结构还是不熟悉!
定义B-存储结构(要求m3;为方便操作,结点中增加双亲结点指针域,最底层的Fail结点用NULL指针表示并且所有结点均存储于内存)。定义B-插入关键字函数、删除关键字函数、查找关键字函数以及按层次遍历输出B-所有结点的函数。主函数定义菜单(1.插入关键字 2.删除关键字 3. 查找关键字 4.层次遍历输出B-所有结点 5.结束程序)。 1. 插入关键字功能的输入为一个关键字,输出为新插入关键字所在结点的信息。 要求结点信息输出格式如下所示: (R102, n, K1, K2, …, Kn) R102表示结点位置,R表示根结点指针;第一个数字1表示根结点的A[1]指针,第二个数字0表求R->A[1]所指结点的A[0]指针,第三个数字2表示R->A[1]->A[0]所指结点的A[2]指针,即该结点指针为: R->A[1]->A[0]->A[2](该结点在第4层上)。n为该结点的关键字数目,K1, K2, …, Kn为该结点中n个非递减有序的关键字。 2. 删除关键字功能的输入为一个关键字,输出为删除成功与失败的信息。 3. 查找关键字功能的输入为一个关键字,输出为查找成功与失败的信息,查找成功时,应输出关键字所在结点信息(结点信息输出方法同1.)。 4. 按层次遍历输出B-所有结点功能的输入为一个字符文件名,输出为该字符文件,字符文件中,一个结点的信息输出一行(结点信息输出方法同1.),结点输出次序为按层次号由小到大并且同层结点从左向右。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值