二叉树的基本操作

1.实验目的

通过该实验,让学生掌握二叉树的相关基本概念,理解二叉树的链式存储,掌握二叉树的几种遍历算法,并通过该实验理解递归的含义,掌握C语言编写递归函数的方法和注意事项。

2.实验主要仪器、设备和材料等

硬件:PC机

软件:Dev-C++、VC 6.0或CodeBlocks等。

3.实验内容(包括实验原理和操作步骤)

  1. 按照先序遍历的顺序创建一个二叉链表;

  2. 对已建立的二叉树实现先序遍历、中序遍历、后序遍历、求深度、求结点数量等操作。

  3. 最好用菜单形式对应各个操作,使其编程一个完整的小软件。

    测试用例:

     

  • 创建

  • 输入:ABC##DE#G##F###

  • 该输入对应的树如上图所示

  • 先序 屏幕输出 A B C D E G F

  • 中序 屏幕输出 C B E G D F A

  • 后序 屏幕输出 C G E F D B A

  • 深度 屏幕显示 深度为5

  • 结点数量 屏幕显示 结点数量为7

  • 销毁 销毁后的二叉树再进行遍历等操作会提示二叉树未创建。

参考界面:

 

#include <stdio.h>
#include <stdlib.h>
#include<iostream>
using namespace std;

typedef char ElemType;
typedef struct BitNode{
    ElemType data;
    struct BitNode *lchild,*rchild;
}BitNode,*BiTree;

//创建二叉树
void CreateBiTree(BiTree &T){
    ElemType ch;
    cin>>ch;
    if(ch=='#'){
         T=NULL;
    }else{
        T=new BitNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }

}
//先序遍历
void PreOrderTraverse(BiTree T){
    if(T){
        cout<<T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);

    }
}

//中序遍历
void InOrderTraverse(BiTree T){
    if(T){
        InOrderTraverse(T->lchild);
        cout<<T->data;
        InOrderTraverse(T->rchild);
    }
}
//后序遍历
void PostTraverse(BiTree T){
    if(T){
        InOrderTraverse(T->lchild);

        InOrderTraverse(T->rchild);
        cout<<T->data;
    }
}
//求二叉树的深度
int Depth(BiTree T){
    int m,n;
    if(T==NULL){
        return 0;
    }else{
        m=Depth(T->lchild);
        n=Depth(T->rchild);
        if(m>n){
            return (m+1);
        }else{
            return (n+1);
        }
    }
}
//统计二叉树节点的数量
int NodeCount(BiTree T){
    if(T==NULL){
        return 0;
    }else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
//销毁二叉树
void DestroyBitree(BiTree T){
    if(T){
        DestroyBitree(T->lchild);
        DestroyBitree(T->rchild);
        free(T);
    }

}
int main(){
	int code;
	int flag=0;
	BiTree T=NULL;
	while(1){
	system("cls");
	printf("**********************************************************\n");
	printf("****                  ****系统菜单****                ****\n");
	printf("****            *  1.创建二叉树                  *    ****\n");
	printf("****            *  2.先序遍历二叉树              *    ****\n");
	printf("****            *  3.中序遍历二叉树              *    ****\n");
	printf("****            *  4.后序遍历二叉树              *    ****\n");
	printf("****            *  5.求二叉树的深度              *    ****\n");
	printf("****            *  6.求二叉树的节点数量          *    ****\n");
	printf("****            *  7.销毁二叉树                  *    ****\n");
	printf("****            *  8.退出                        *    ****\n");
	printf("**********************************************************\n");
		printf("请输入操作代码:");
		scanf("%d",&code);
		getchar();
		switch(code)
		{
		case 1:
			{
			    printf("请输入二叉树元素(‘#’表示为空)\n");
			    CreateBiTree(T);
                printf("二叉树创建成功\n");
                flag=1;
				break;
			}
		case 2:
			{
                if(flag==0){
                    printf("二叉树未创建\n");
                }else{
                    printf("先序遍历后:\n");
                PreOrderTraverse(T);
                printf("\n");
		    }
				break;
			}
		case 3:
                if(flag==0){
                    printf("二叉树未创建\n");
                }else{
                    printf("中序遍历后:\n");
                    InOrderTraverse(T);
                    printf("\n");
                }

		    break;
		case 4:
		    if(flag==0){
                    printf("二叉树未创建\n");
                }else{
                    printf("先序遍历后:\n");
                PostTraverse(T);
                printf("\n");
		    }


		    break;
		case 5:
		    int deep;
            if(flag==0){
                printf("二叉树未创建\n");
            }else{
                deep=Depth(T);
                printf("二叉树的深度为:%d\n",deep);
		    }
			break;
		case 6:
		    int num;
		    if(flag==0){
                printf("二叉树未创建\n");
            }else{
                num=NodeCount(T);
                printf("二叉树的节点数量为:%d\n",num);
		    }
		    break;
		case 7:
		    if(flag==0){
                printf("二叉树未创建\n");
            }else{
                DestroyBitree(T);
                flag=0;
                printf("二叉树已被销毁\n",num);
		    }
		    break;
		case 8:
			{
				printf("程序结束!\n");
				return 0;
				break;
			}
		default:printf("数据无效,请重新输入!");
		}
		system("pause");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值