数据结构:树和二叉树的基本使用

一、 实验目的

1.掌握树和二叉树的结构特征,以及各种存储结构的特点及适用范围。
2.掌握用指针类型描述、访问和处理二叉树的运算。

二、实验内容

1.输入先序遍历字符序列,建立二叉链表。
2.分别输出先序、中序和后序遍历二叉树的序列(递归算法)。
3.求二叉树的结点个数。
4.输出二叉树的叶子结点。
5.求二叉树的高度。
6.在主函数中设计一个简单的菜单,分别调试上述算法。
说明:
可以通过下面的案例进行程序测试
输入的先序遍历字符序列为:ABC##DE#G##F###(期中’#’代表空树)。建立好的二叉树及二叉链表表示形式如下图所示:
在这里插入图片描述

代码内容

#include<iostream>
using namespace std;
typedef char TElemType;
#define OK 1
//二叉树的二叉链表存储表示 
typedef struct BiTNode{
	TElemType data;		//节点数据域 
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//使用递归的方法先序遍历建立二叉链表,其中'#'表示空树
void CreateBiTree(BiTree &T){
	 TElemType ch;
	 cin>>ch;
	 if(ch=='#')
	 	T=NULL;		//递归出口 
	else{
		T=new BiTNode;		//生成根节点 
		T->data=ch;		//树的数据域赋值ch
		//(*T).data=ch;	
		CreateBiTree(T->lchild);	//递归创建左子树 
		CreateBiTree(T->rchild);	//递归创建右子树 
	}
} 
//使用递归中序输出二叉树
void InOrderTraverse(BiTree T){
	//树非空就开始递归遍历 
	if(T){
		InOrderTraverse(T->lchild);	//中序遍历左子树 
		cout<<T->data<<" ";		//访问根节点 
		InOrderTraverse(T->rchild);	//中序遍历右子树 
	}
} 
//使用递归先序输出二叉树
void PreorderTraverse(BiTree T){
	//树非空就开始递归遍历 
	if(T){
		cout<<T->data<<" ";		//访问根节点 
		PreorderTraverse(T->lchild);	//先序遍历左子树 
		PreorderTraverse(T->rchild);	//先序遍历右子树 
	}
} 
//使用递归后序输出二叉树
void PostorderTraverse(BiTree T){
	//树非空就开始递归遍历 
	if(T){
		PostorderTraverse(T->lchild);	//后序遍历左子树 
		PostorderTraverse(T->rchild);	//后序遍历右子树 
		cout<<T->data<<" ";		//访问根节点 
	}
}
//递归统计二叉树的节点个数
int NodeCount(BiTree T){
	if(T)//树非空,节点数为左子树节点数+有右节点数+1 
		return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
	//如果树为空,递归结束,节点数为0 
	return 0;
} 
//使用递归计算二叉树的高度
int Depth(BiTree T){
	int m,n;//左子树高度m,右子树高度n 
	//树非空开始计算高度 
	if(T){
		m=Depth(T->lchild);	//递归计算左子树高度
		n=Depth(T->rchild);	//递归计算右子树高度
		if(m>n)
			return m+1;
		return n+1; 
	}
	//树为空
	else
		return 0; 
} 
//递归输出所有叶子节点
void PrintLeavers(BiTree T){
	//树非空就输出叶子节点 
	if(T){
		if(!T->lchild&&!T->rchild)
			cout<<T->data<<" ";		//输出叶子节点 
		PrintLeavers(T->lchild);	//递归左子树 
		PrintLeavers(T->rchild);	//递归右子树 
	}
} 
//展示上述功能 
void Display(BiTree T){
	cout<<"    二叉树程序    "<<endl;
	cout<<"------------------"<<endl;
	cout<<"按序号输入执行程序"<<endl;
	cout<<"1.建立二叉树"<<endl;
	cout<<"2.先序遍历二叉树"<<endl;
	cout<<"3.中序遍历二叉树"<<endl;
	cout<<"4.后序遍历二叉树"<<endl;
	cout<<"5.求二叉树节点数"<<endl;
	cout<<"6.输出叶子节点" <<endl;
	cout<<"7.求二叉树的高度"<<endl;
	cout<<"退出程序请按0"<<endl; 
	cout<<"------------------"<<endl;
	int n;
	while(OK){
		cout<<"请输入要执行的功能"<<endl;
		cin>>n;
		switch(n){
			case 1:
				cout<<"输入节点值"<<endl; 
				CreateBiTree(T);	//建立二叉链表 
				break;
			case 2:
				cout<<"先序遍历"<<endl;
				PreorderTraverse(T);	//先序遍历
				cout<<endl;
				break;
			case 3:
				cout<<"中序遍历"<<endl;
				 InOrderTraverse(T);	//中序遍历
				 cout<<endl;
				 break; 
			case 4:
				cout<<"后序遍历"<<endl;
				PostorderTraverse(T);	//后序遍历
				cout<<endl;
				break;
			case 5:
				cout<<"二叉树节点个数为:"<<NodeCount(T)<<endl;	//二叉树结点个数
				break;
			case 6:
				cout<<"二叉树叶子节点如下"<<endl; 
				PrintLeavers(T);	//输出叶子节点
				break;
			case 7:
				cout<<"二叉树高度为:"<<Depth(T)<<endl;	//输出二叉树高度
				break;
			case 0:
				exit(0); 
		}
	}
}
int main(){
	BiTree T;
	Display(T);
	return 0;
}

测试结果

在这里插入图片描述

总结

这个试验考察的是对二叉树结构的理解,以及对递归方法的使用和理解,如何去定义实现和使用递归函数,这个程序只是简单的使用了二叉树和递归用到的知识还是比较基础的
但,身为菜狗的我…搞了好久才搞懂…

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

82年苏打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值