数据结构实验二
if(root == 0) return;//递归调用的结束条件 if(i==j)//访问节点数据 {
printf("%d",root->data); i--; } else { printf(" %d",root->data); i--; } PreOrder(root->lchild);//递归遍历左子树 PreOrder(root->rchild);//递归遍历右子树 } void InOrder(Cnode root)//中序递归遍历二叉树 root { if(root == 0) return;//递归调用的结束条件 InOrder(root->lchild);//递归遍历左子树 if(i==j)//访问节点数据 { printf("%d",root->data); i--; } else { printf(" %d",root->data); i--; } InOrder(root->rchild);//递归遍历右子树 } void PostOrder(Cnode root)//后序递归遍历二叉树 root { if(root == NULL) return;//递归调用的结束条件 PostOrder(root->lchild);//递归遍历左子树 PostOrder(root->rchild);//递归遍历右子树 if(i==j)//访问节点数据 { printf("%d",root->data); i--; } else { printf(" %d",root->data); i--; } } int main() { Cnode root;
2.在二叉树中,P 所指结点为二叉树中任一给定的结点,编写算法求从根结点到 P 所指结点之 间的路径。 #include <stdio.h> #include <stdlib.h> #define MaxNode 500 typedef struct T_Node{
3.试编写按层次顺序遍历二叉树的算法 二叉树的创建同第一题,要实现二叉树的层序遍历,采用一个队列 queue,先将二叉树的
根节点入队列,然后出队列并输出该节点。若它有左子树,便将左子树树根节点入队列;若 它有右子树,便将右子树根节点入队列,如此直到队列为空为止。队列的特点是先进先出,
从而达到层次遍历二叉树的目的。
#include <stdio.h> #include <stdlib.h> typedef struct T_Node{
int data; struct T_Node *lchild,*rchild; }T_Node; typedef T_Node *Cnode; int i,j; int create_main(Cnode root,int a,int b)//找到父节点,若有左孩子,插到右孩子,否则插到左孩子 { if(root == 0)//只有一个节点 {
3.试编写按层次顺序遍历二叉树的算法 1) 问题描述:编写按层次顺序遍历二叉树的算法 2) 实验要求:以二叉链表作为存储结构
4.编写算法求二叉树高度及宽度。 1) 问题描述:二叉树高度是指树中所有节点的最大层数,二叉树宽度是指在二叉树的各层上, 具有节点数最多的那一层上的节点总数。 2) 实验要求:以二叉链表作为存储结构
四、 收获与体会 通过本次实验,对二叉树的建立以及基本操作如:先序递归遍历,中序递归遍历,后续递
归遍历,先序非递归遍历,查询值为 x 的节点,求高度等操作基本熟悉,在运用的时候还有 些不熟,对路径和宽度不是很熟,稍微加深了对栈和队列的了解。 五、 源代码清单 1. 以二叉链表为存储结构,实现二叉树的创建、遍历
○有 ○无
○无报告
○有 ○无
教师签字:
பைடு நூலகம்
一、实验目的 实验目的:通过实验使学生深刻理解二叉树性质,验证二叉树的遍历算法,并能在遍历算法 基础上实现较复杂算法设计。
二、实验题目与要求
要求:第 1 题必做,2-5 题中至少选择 1 题。
1. 以二叉链表为存储结构,实现二叉树的创建、遍历 1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能:
3)注意问题: 注意理解递归算法的执行步骤。 注意字符类型数据在输入时的处理。 重点理解如何利用栈结构实现非递归算法
2.在二叉树中,P 所指结点为二叉树中任一给定的结点,编写算法求从根结点到 P 所指结点之 间的路径。 1) 实验要求:以二叉链表作为存储结构 2)实验提示:采用非递归后序遍历二叉树,当后序遍历访问到 P 所指结点时,此时栈中所有 结点均为 P 所指结点的祖先,由这些祖先便构成了一条从根结点到 P 所指结点之间的路径。
实验报告
学院(系)名称:计算机科学与工程学院
姓名
赵振宇
学号
20175302
专业
班级
2017 级 4 班 实验项目
实验二:二叉树的操作
课程名称
数据结构与算法
课程代码
计算机科学与技术 0661913
实验时间
2019 年 5 月 21 日 第 3、4 节 实验地点
7-219
考核 标准
成绩 栏
实验过程 25 分
4.编写算法求二叉树高度及宽度。
二叉树的创建同第一题,二叉树的高度采用递归实现,二叉树的深度应为其左、右子树深度的最大值 加 1,分别递归左右子树求出高度,并令 max 等于较大的一个,最后返回 max+1。
要求最大宽度,可以循环求取每一层的宽度,存入一个数组,然后在这个数组里求最大值即可,数组 下标即高度。对于求某一层的宽度,可以写成一个子函数,参数考虑起始结点以及对应的层数。。
2. 在二叉树中,P 所指结点为二叉树中任一给定的结点,编写算法求从根结点到 P 所指结点 之间的路径。
二叉树的建立同第 1 题,要求是后序遍历二叉树找出根节点到某一节点 x 的路径,利用 结构体栈,其中包含一个节点型的 link 和一个标志 flag,当 flag 为 1 的时候不能访问,当 flag 为 2 的时候才能访问。当栈顶中节点的 data 等于 x->的 data 时,结束遍历,并输出路 径。
return 0; } else if(root->data == a)//是否为父节点 {
Cnode p=(Cnode)malloc(sizeof(T_Node));
if(root->lchild)//存在左孩子 {
p->data=b; p->lchild=0; p->rchild=0; root->rchild=p; return 0; } else//没有左孩子 { p->data=b; p->lchild=0; p->rchild=0; root->lchild=p; return 0; } } create_main(root->lchild,a,b);//递归在左孩子中找到父节点 create_main(root->rchild,a,b);//若在左孩子中没找到父节点,递归在右孩子中找到父节点 } Cnode create_minor(int n)//n 为节点个数,创建根以及根的左孩子 { Cnode root=(Cnode)malloc(sizeof(T_Node)); int a,b; if(n==1)//只有一个节点 { root->data=0; root->lchild=0; root->rchild=0; return root; } scanf("%d %d",&a,&b); root->data=a; Cnode p=(Cnode)malloc(sizeof(T_Node)); p->data=b; p->lchild=0; p->rchild=0; root->lchild=p; n=n-1; while(n-1>0)//执行次数 { scanf("%d %d",&a,&b); create_main(root,a,b); n=n-1; } return root; } void PreOrder(Cnode root)//先序递归遍历二叉树 root {
程序运行 20 分
回答问题 15 分
实验报告 30 分
特色 考勤违
功能 纪情况 成绩
5分
5分
其它批改意见:
考核 内容
评价在实验 课堂中的表 现,包括实 验态度、编 写程序过程 等内容等。
□功能完善, □功能不全 □有小错 □无法运行
○正确 ○基本正确 ○有提示 ○无法回答
○完整
○较完整 ○一般 ○内容极少
1…建立树 2…前序遍历树 3…中序(非递归)遍历树 4…后序遍历树 0…结束 2)实验要求:在程序中定义下述函数,并实现要求的函数功能: CreateTree():按从键盘输入的前序序列,创建树 PreOrderTree():前序遍历树(递归) InOrderTree():中序(非递归)遍历树 LaOrderTree(): 后序遍历树(递归)
三、 实验过程与实验结果 1. 以二叉链表为存储结构,实现二叉树的创建、遍历
首先是创建二叉树,先定义一个结构体,包含一个数据域和两个指向左孩子与右孩子的 指针域,当输入第一组 a,b 时,此时的 a 即为根节点并赋给 root,b 为 a 也就是根节点的左 孩子,当在输入 a,b 的时候先判断 root->data 是否等于此时的 a,若等于,判断有无左孩子, 若无则 b 为其左孩子,若有,则 b 为其右孩子。若 root->data 不等于此时的 a,则递归先从 root 的左孩子寻找 data 等于 a 的节点,若左孩子中没找到,则递归从右孩子中寻找 data 等 于 a 的节点;