实验项目名称:二叉树操作的实现
实验目的与要求:
1.基础知识:掌握数据结构中二叉树的相关知识;
2.参考教材相关算法,完成以下程序功能: .
(1)能够采用二叉链存储结构实现二叉树的建立;
(2)完成已建立的二叉树的三种遍历,并分别打印其结果;
(3)至少完成教材P121-122中其它任意一种操作,或者二叉树中特定结点的统计操作,如统计用户给定的元素数目、叶子数目、只有左或右孩子的结点数目等;
(4)程序中有友好的操作设计.
实验性质:验证性(4学时)
说明:程序包含的主要函数:主函数、操作界面、建树、独立的
三种遍历、其它自定义的操作算法,及相关注释;
注意:在主函数调用子函数流程中体现先建树后遍历和其它操作
的条件控制,即在调用除建树算法以外的其它所有算法前,先判
断树是否已经建立,若没建树,只能先建树,不能做其它操作。

二叉树源代码:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define NULL 0
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

Status CreateBiTree(BiTree&T)//按先序次序输入二叉树结点的值(一个字符),#表示空树
{
       char ch;
       scanf("%c",&ch);
       if(ch=='#')
       T=NULL;   
       else{
       if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(ERROR);
       T->data=ch;
       CreateBiTree(T->lchild);
       CreateBiTree(T->rchild);}
    return 0;
}

LRD(BiTree T)//后序遍历
{
    if(T!=NULL)
    {
        LRD(T->lchild);
        LRD(T->rchild);
        printf("%c",T->data);
    }
    return OK;
}

LDR(BiTree T)//中序遍历
{
    if(T!=NULL)
    {
        LDR(T->lchild);
        printf("%c",T->data);
        LDR(T->rchild);
    }
    return OK;
}

DLR(BiTree T)//先序遍历
{
    if(T!=NULL)
    {
        printf("%c",T->data);
        DLR(T->lchild);
        DLR(T->rchild);
    }
    return OK;
}


Status TreeDeapth(BiTree T)
{
	int height,leftH,rightH;     //左右子树的深度和最深的深度
	if(T==NULL)
		height=0;
	else{
		leftH=TreeDeapth(T->lchild);
		rightH=TreeDeapth(T->rchild);
		if(leftH>rightH)
			height=leftH+1;
		else
			height=rightH+1;;
	}
	return height;

}
Status TreeEmpty(BiTree T)//判断树是否存在
{
    if(T==NULL)
    return ERROR;
    else
    return OK;
}

Status OperateMenu(int num)
{
    printf("------****操作菜单****------\n");
	printf("------    0 退出系统\n");
    printf("------    1 后序遍历\n");
    printf("------    2 中序遍历\n");
    printf("------    3 先序遍历\n");
    printf("------    4 判断树是否存在\n");
    printf("------    5 二叉树的深度\n");
    printf("------    6 创建二叉树\n");
    printf("------    请选择你所需要的操作\n");
    scanf("%d",&num);
	return num;
}
main()
{
    BiTree T;
    T=NULL;
    int num=-1,h;  
    while(num!=0)
    {
        {
       num=OperateMenu(num);
    }
    switch(num)
    {
        case 1:
        if(T==NULL)
        {printf("树不存在");}
        LRD(T);
        printf("\n");
        break;//后序遍历
        case 2: 
        if(T==NULL)
        {printf("树不存在");}
        LDR(T);
        printf("\n");
        break;//中序遍历
        case 3:
        if(T==NULL)
        {printf("树不存在");}
        DLR(T);
        printf("\n");
        break;//先序遍历
        case 4:
        if(TreeEmpty(T))
        printf("树存在\n");
        else
        printf("树不存在\n");break;
        case 5:
        if(T==NULL)
        {printf("树不存在\n");}
        else
        {h=TreeDeapth(T);
        printf("该树的最大深度为%d\n",h);}break;
        case 6:
        fflush(stdin);
        printf("按先序次序输入二叉树结点的值(一个字符)#表示空树\n");
        CreateBiTree(T);break;

    }
}
}