IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构 实验7 二叉树的应用 -> 正文阅读

[数据结构与算法]数据结构 实验7 二叉树的应用

实验7 二叉树的应用

(1)实验目的

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

(2)实验内容

实现教材中算法6.4描述的二叉树创建算法,在此基础上实现二叉树的先序、后序递归遍历算法、两种非递归中序遍历、层序遍历、求二叉树的深度。注意:在非递归算法中用到栈和队列时,不要调用系统的栈和队列,需要自己实现栈和队列的操作。

(3)参考界面

在这里插入图片描述

(4)验收/测试用例

? 创建
输入 :ABCKaTeX parse error: Can't use function '$' in math mode at position 3: DE$?GF$$$ ($表示空格)
该输入对应的树如图所示
? 先序 屏幕输出 A B C D E G F
? 后序 屏幕输出 C G E F D B A
? 中序 屏幕输出 C B E G D F A
(两种中序非递归还需看源代码)
? 层序 屏幕输出 A B C D E F G
? 深度 屏幕显示 深度为5
? 另外自己画出一棵树,再测试一遍。

在这里插入图片描述

运行环境

     Dev  C++

主要源代码

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
#define OK 1
#define ERROR 0
#define MAX_TREE_SIZE 100
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char TElemType;
typedef bool Status;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild ,*rchild;
}BiTNode,*BiTree;
BiTree T;

typedef BiTree SElemType;
typedef struct{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{
	S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if(!S.base) exit(OVERFLOW);
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
}

Status PushStack(SqStack &S,SElemType p)
{
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!S.base)	exit(OVERFLOW);
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++ = p;
	return OK;
}

Status PopStack(SqStack &S,SElemType &p)
{
	if(S.top == S.base)	return ERROR;
	p=*--S.top;
	return OK;
}

Status TopStack(SqStack &S,SElemType &p)
{
	if(S.top==S.base)
		return ERROR;
	p=*(S.top-1);
	return OK;
}

//1.创建二叉树 
Status createBiTree(BiTree &T)
{
	char ch;
	cin>>ch;
	if(ch=='$')
		T=NULL;
	else
	{
		if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
		T->data=ch;
		createBiTree(T->lchild);
		createBiTree(T->rchild);
	}
	return OK;
}

Status Print(TElemType e)
{
	printf("%c ",e);
	return OK;
}
//2.先序 
Status lastT(BiTree &T,Status(* visit)(TElemType e))
{
	if(T)
	{
		if(visit(T->data))
			if(lastT(T->lchild,Print))
				if(lastT(T->rchild,Print))
					return OK;
		return ERROR;
	}
	return OK;
}
//3.中序1 
Status zhongT(BiTree &T,Status(* visit)(TElemType e))
{
	SqStack S;
	InitStack(S);
	SElemType p;
	PushStack(S,T);
	while(S.top!=S.base)
	{
		while(TopStack(S,p) &&  p)
			PushStack(S,p->lchild);
		PopStack(S,p);
		if(S.top!=S.base)
		{
			PopStack(S,p);
			if(!visit(p->data))
				return ERROR;
			PushStack(S,p->rchild);
		}
	}
}
//4.中序2 
Status zhongT2(BiTree T,Status(* visit)(TElemType e))
{
	SqStack S;
	InitStack(S);
	SElemType p;
	p=T;
	while(p || S.top!=S.base)
	{
		if(p)
		{
			PushStack(S,p);
			p=p->lchild;
		}
		else
		{
			PopStack(S,p);
			if(!visit(p->data))
				return ERROR;
			p=p->rchild;
		}
	}
	return OK;
}
//5.后序 
Status postTree(BiTree &T,Status(* visit)(TElemType e))
{
	if(T)
	{
		if(postTree(T->lchild,Print))
			if(postTree(T->rchild,Print))
				if(visit(T->data))
					return OK;
		return ERROR;
	}
	return OK;
}
//6.层序 
Status cengTree(BiTree &T,Status(* visit)(TElemType e))
{
	int i=0,j=0;
	BiTree p[100];
	if(T)
		p[j++]=T;
	while(i<j)
	{
		visit(p[i]->data);
		if(p[i]->lchild)
			p[j++]=p[i]->lchild;
		if(p[i]->rchild)
			p[j++]=p[i]->rchild;
		i++;
	}
}

int DeepTree(BiTree T)
{
	int LD,RD;
	if(T==NULL)
		return 0;
	else
	{
		LD=DeepTree(T->lchild);
		RD=DeepTree(T->rchild);
		return (LD>=RD?LD:RD)+1;
	}
}

int main()
{
	cout<<"********************************"<<endl;
	cout<<"******* 1.创建二叉树      ******"<<endl;
	cout<<"******* 2.先序遍历二叉树  ******"<<endl;
	cout<<"******* 3.中序遍历二叉树1 ******"<<endl;
	cout<<"******* 4.中序遍历二叉树2 ******"<<endl;
	cout<<"******* 5.后序遍历二叉树  ******"<<endl;
	cout<<"******* 6.层序遍历二叉树  ******"<<endl;
	cout<<"******* 7.求二叉树的深度  ******"<<endl;
	cout<<"******* 8.退出            ******"<<endl;
	cout<<"********************************"<<endl;
	
	int n;
	do
	{
		cout<<"请输入选择:" ;
		cin>>n;
		switch(n)
		{
			case 1:
				cout<<"请输入二叉树的元素来构建二叉树 ($表示空格) :\n    "; 
				createBiTree(T);
				cout<<"创建成功!"<<endl;
				break;
			case 2:
				cout<<"先序遍历:"; 
				lastT(T,Print);
				cout<<endl;
				break;
			case 3:
				cout<<"中序遍历1:"; 
				zhongT(T,Print);
				cout<<endl;
				break;
			case 4:
				cout<<"中序遍历2:"; 
				zhongT2(T,Print);
				cout<<endl; 
				break;
			case 5:
				cout<<"后序遍历:"; 
				postTree(T,Print);
				cout<<endl;
				break;
			case 6:
				cout<<"层序遍历:"; 
				cengTree(T,Print);
				cout<<endl; 
				break;
			case 7:
				cout<<"该二叉树的深度是:";
				cout<<DeepTree(T)<<endl;
				break;
			default :
				cout<<"输入指令不存在"<<endl; 
				break;
		}
	}while(n!=8);
	cout<<"程序已退出,欢迎下次使用"<<endl;
	return 0;
}


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:11:28  更:2021-10-22 11:11:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:53:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码