二叉树的建立及其基本操作实验报告

一、实验目的
掌握二叉树的链式存储结构的建立方法和对二叉树的各种操作算法。利用二叉树的基本操作,构造哈夫曼树。
二、实验内容1

  1. 问题描述
    (1)、按照前序次序建立一棵二叉树;
    (2)、用前、中、后序递归遍历的方法遍历二叉树;
    (3)、求二叉树的深度;

  2. 数据结构及算法设计
    首先,使用结构体建立树的基本结构BTNode,包括data,lchild,rchild。
    再按照前序次序建立一颗二叉树,第一个元素是根节点,遇到‘#’将该结点定为空结点,遍历字符串,就按照前序次序建立了一颗树。
    然后按照前序递归遍历(先输出根节点,再前序递归遍历左子女,最后前序递归遍历右子女)、中序递归遍历(先中序递归遍历左子女,再输出根节点,最后中序递归遍历右子女)、后序递归遍历(先后序递归遍历左子女,再前序递归遍历右子女,最后输出根节点)的特点分别写出对应函数,采用递归的思想。
    最后设计函数求二叉树的深度。让检查到该节点下还存在左子树或右子树,计数并递归进入,当检查到没有左右子女时返回,最后返回计数+1,即二叉树的深度。
    时间复杂度Ω(n)。
    效果图

                                              效果图
    
  3. 程序实现

#include<bits/stdc++.h>
using namespace std;
typedef char ElemType;
typedef struct node						//定义二叉树结构 
{
	ElemType data;
	struct node *lchild;
	struct node *rchild;
}BTNode;
void createBTree(BTNode * &b)				//先序创建二叉树
{
    char ch;
    cin>>ch;
    if(ch=='#') b=NULL;					//遇到#时该节点为空
    else{
        b=new BTNode;
        b->data=ch;
        createBTree(b->lchild);
        createBTree(b->rchild);
    }
}
void preorder(BTNode *b)                //先序遍历 
{
	if(b!=NULL)
	{
		printf("%c ",b->data);          //访问根节点 
		preorder(b->lchild);            //先序遍历左子树 
		preorder(b->rchild);            //先序遍历右子树
	}
}
void inorder(BTNode *b)              	//中序遍历 
{
	if(b!=NULL)
	{
		inorder(b->lchild);             //中序遍历左子树
		printf("%c ",b->data);          //访问根节点
		inorder(b->rchild);	            //中序遍历右子树
	}
}
void postorder(BTNode *b)				//后序遍历 
{
	if(b!=NULL)
	{
		postorder(b->lchild);           //后序遍历左子树
		postorder(b->rchild);			//后序遍历右子树
		printf("%c ",b->data);          //访问根节点
	}
}
int btheight(BTNode *b)					//求二叉树的深度 
{
	int lchildh,rchildh;
	if(b==NULL) return 0;
	else 
	{
		lchildh=btheight(b->lchild);	//求左子树的高度为lchildh 
		rchildh=btheight(b->rchild);	//求右子树的高度为rchildh 
		return (lchildh>rchildh)?(lchildh+1):(rchildh+1);
	}
}
int main()
{
	BTNode *b;
	cout<<"先序创建二叉树:";			//输入数据:AB#CD##E##F#GH###
	createBTree(b);
	cout<<"先序遍历输出:"; 
	preorder(b);
	cout<<endl<<"中序遍历输出:"; 
	inorder(b);
	cout<<endl<<"后序遍历输出:";
	postorder(b); 
	cout<<endl<<"二叉树的深度:"<<btheight(b);
	btheight(b); 
	return 0;
}
  1. 测试
    在这里插入图片描述

总结
本题采用二叉链表存储二叉树,二叉链表由数据元素,左孩子指针,右孩子指针组成。本次实验难度不大,对于初次接触树的概念的我来说是一次很好的锻炼机会,让我熟悉了建立二叉树的方法、先序递归遍历过程和方法、中序递归遍历过程和方法、后序递归遍历过程和方法、求二叉树的高度的函数,以及加深了对哈夫曼树的理解,同时,增强了我对于二叉树孩子与双亲的关系的理解,有助于更好的了解二叉树的结构。本次实验我还采用了递归算法,这也在一定程度上增强了我对递归的理解。

https://download.csdn.net/download/weixin_51273415/40231280

  • 15
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、实验目的: 理解二叉树特别是完全二叉树的性质,掌握二叉树的存储结构(二叉链表);熟练掌握二叉树的常用操作算法(初始化、插入结点、删除结点、遍历等);初步掌握二叉树的应用。 二、实验内容: 要求采用二叉链表作为存储结构,完成二叉树建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。 具体要求如下: ①给出基于二叉链表的二叉树类的定义; ②给出二叉树初始化(构造函数)的实现; ③给出二叉树三种遍历算法的递归实现; ④二叉树先序遍历的非递归算法实现; ⑤利用二叉树的遍历算法二叉树的结点数、二叉树的叶结点数、二叉树的高度; ⑥二叉树的撤销删除 三、实验步骤: 1、需求分析: 本演示程序用JAVA编写,完成树的生成,任意位置的插入、删除,以及遍历二叉树中的结点,查找和修改树中元素的值。 ① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;遍历时采用三种遍历方法中的一种遍历方法;修改操作时需要输入的元素的值;查找操作时,需要找到要查找元素的位置。在所有输入中,元素的值都是整数。 ② 输出的形式:在所有四种操作中都显示操作是否正确以及操作后树中的内容。其中删除操作后显示删除的元素的值,遍历二叉树中的元素,查找操作、修改操作后显示修改的值。 ③ 程序所能达到的功能:完成树的生成(通过插入操作)、插入、删除、遍历、查找、修改操作。 ④ 测试数据: A. 树中已有以50,25,75,12,37,43,30,33,87,93,97为关键字的结点 B. 插入操作中依次输入10,20,30,40,50,60,70,80,90,100十个数 C. 删除操作中输入10删除值为10的元素 D. 查找操作中输入20,30,40,50返回这个元素在树中的位置 2.概要设计: 1)为了实现上述程序功能,需要定义树的抽象数据类型: public int iData; public double dData; public Node leftChild; public Node rightChild; private Node root;int value; private Node getSuccessor; 基本操作:{ Tree () 操作结果:构造一个空的二叉树 insert () 初始条件:是否存在一个空二叉树 操作结果:往二叉树中插入数值 delete () 初始条件:存在一非空的二叉树 操作条件:将二叉树中的元素删除 displayTree () 初始条件:存在一非空的树 操作条件:显示非空树中的所有元素的值 getString () 初始条件:存在一非空的二叉树 操作结果:返回整个字符串的数值 getChar () 初始条件:存在一非空的二叉树 操作结果:返回字符型的数值 getInt () 初始条件:存在一非空的二叉树 操作结果:返回整型的数值 find () 初始条件:存在一非空二叉树 操作结果:从二叉树中查找某一元素 traverse () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行遍历 preorder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行先根遍历 inOrder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行中根遍历 postOrder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行后根遍历 DisplayNode () 初始条件:存在一非空的二叉树 操作结果:显示出二叉树中的整形数值和双精度浮点型数值 public static void main 操作结果:调用主函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

耗子煨汁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值