数据结构实验之二叉树实验基础

简介: 本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。

 二叉树实验基础

、实验目的

1、掌握二叉树的基本特性

2、掌握二叉树的先序、中序、后序的递归遍历算法

3、理解二叉树的先序、中序、后序的非递归遍历算法

4、通过求二叉树的深度、叶子结点数和层序遍历等算法,理解二叉树的基本特性

二、实验预习

说明以下概念

1二叉树二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 [1]  

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点 [1] 

2递归遍历递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。

3非递归遍历前序遍历是指按照根左右的顺序依次遍历,使用非递归遍历,一般会用到栈,利用先进后出的特性来达到访问二叉树节点目的。

4层序遍历就是将一颗树按照每一层每一层的方式进行遍历

三、实验内容和要求

1、阅读并运行下面程序,根据输入写出运行结果,并画出二叉树的形态。

#include<stdio.h>

#include<malloc.h>

#define MAX 20

typedef struct BTNode{

/*节点结构声明*/

char data ;

/*节点数据*/

struct BTNode *lchild;

struct BTNode *rchild ; /*指针*/

}*BiTree;

void createBiTree(BiTree *t){ /* 先序遍历创建二叉树*/

char s;

BiTree q;

printf("\nplease input data:(exit for #)");

s=getche();

if(s=='#'){*t=NULL; return;}

q=(BiTree)malloc(sizeof(struct BTNode));

if(q==NULL){printf("Memory alloc failure!"); exit(0);}

q->data=s;

*t=q;

createBiTree(&q->lchild); /*递归建立左子树*/

createBiTree(&q->rchild); /*递归建立右子树*/}

void PreOrder(BiTree p){ /* 先序遍历二叉树*/

if ( p!= NULL ) {

printf("%c", p->data);

PreOrder( p->lchild ) ;

PreOrder( p->rchild) ;

}

}

void InOrder(BiTree p){ /* 中序遍历二叉树*/

if( p!= NULL ) {

InOrder( p->lchild ) ;

printf("%c", p->data);

InOrder( p->rchild) ;

}

}

void PostOrder(BiTree p){ /* 后序遍历二叉树*/

if ( p!= NULL ) {

PostOrder( p->lchild ) ;

PostOrder( p->rchild) ;

printf("%c", p->data);

}

}

void Preorder_n(BiTree p){ /*先序遍历的非递归算法*/

BiTree stack[MAX],q;

int top=0,i;

for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化栈*/

q=p;

while(q!=NULL){

printf("%c",q->data);

if(q->rchild!=NULL) stack[top++]=q->rchild;

if(q->lchild!=NULL) q=q->lchild;

else

if(top>0) q=stack[--top];

else q=NULL;

}

}

void release(BiTree t){ /*释放二叉树空间*/

if(t!=NULL){

release(t->lchild);

release(t->rchild);

free(t);}

}

int main(){

BiTree t=NULL;

createBiTree(&t);

printf("\n\nPreOrder the tree is:");

PreOrder(t);

printf("\n\nInOrder the tree is:");

InOrder(t);

printf("\n\nPostOrder the tree is:");

PostOrder(t);

printf("\n\n 先序遍历序列(非递归):");

Preorder_n(t);

release(t);

return 0;

}

l

运行程序

输入:

ABC##DE#G##F###

运行结果:

image.gif 编辑

image.gif 编辑

注:getche()在头文件:<conio.h>

二叉树形态:

image.gif 编辑

2、在上题中补充求二叉树中求结点总数算法(提示:可在某种遍历过程中统计遍历的结点数),并在主函数中补充相应的调用验证正确性。

算法代码:

int NodeCount(BiTree T){//统计树的总结点数

     int nodes;

     if(T==NULL)return 0;//如果树为空,则总结点数为0

     else{//否则为根结点个数加上根左子树中结点个数,再加上右子树中结点个数

           nodes=1+NodeCount(T->lchild)+NodeCount(T->rchild);

           return nodes;

     }

}

image.gif 编辑

3、在上题中补充求二叉树中求叶子结点总数算法(提示:可在某种遍历过程中统计遍历的叶子结点数),并在主函数中补充相应的调用验证正确性。

算法代码:

int LeafNode(BiTree T){//统计树的叶子结点(度为0)个数

     int lnodes;

     if(T==NULL)return 0;//如果树为空,则叶子结点数为0

     else if(T->lchild==NULL&&T->rchild==NULL)return 1;//如果根节点的左右子树都为空,则叶子结点仅根结点一个

     else lnodes=LeafNode(T->lchild)+LeafNode(T->rchild);//当某个结点既有左子树又有右子树时,说明该结点不是叶子结点,因此叶子结点个数等于左子树及右子树中叶子结点数之和

     return lnodes;

}

image.gif 编辑

四、实验小结

在求解树中不同度的结点数时,首先要搞清楚主要思想是什么,然后再进行代码的构思。以求解度为2的结点数为例:①如果树为空,则度为2的结点数为0;②如果根节点的左右孩子均为空,树中只有一个结点,且该结点度为0,则度为2的结点为0 ;③如果某一结点的左右子树中有一个为空,则需进一步判断不为空的子树中度为2的结点有多少 ;④当某结点既有左子树又有右子树时,度为2的结点数就等于该结点加上其左右子树中度为2的结点数

目录
相关文章
|
1月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
58 4
|
1月前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
46 4
|
1月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
54 4
|
1月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
42 4
|
1月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
57 4
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
54 4
|
1月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
132 8
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
32 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
37 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
2月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
31 1