数据结构实验7.2:二叉树的基本运算

文章目录

  • 一,实验目的
  • 二,问题描述
  • 三,基本要求
  • 四,实验操作
  • 五,示例代码
  • 六,运行效果


一,实验目的

  1. 深入理解树与二叉树的基本概念,包括节点、度、层次、深度等,清晰区分二叉树与一般树的结构特点,为后续学习和应用打下坚实基础。
  2. 熟练掌握用递归方法实现二叉树的遍历,通过递归算法的设计和实现,深刻体会递归思想在处理树结构数据时的简洁性和高效性,提高对递归算法的运用能力。
  3. 掌握借助栈或队列实现二叉树遍历的非递归迭代方法,理解栈和队列在模拟递归过程中的作用,培养利用数据结构解决问题的能力,拓宽算法设计思路。
  4. 熟练掌握构造Huffman树、Huffman编码等操作,理解Huffman树的原理和应用场景,能够根据给定的字符频率构建最优的Huffman树,并生成相应的Huffman编码,提高对数据压缩等实际问题的解决能力。
  5. 通过对二叉树相关知识的学习和编程实践,加深对二叉树的理解,逐步培养运用二叉树结构解决实际问题的编程能力,提升算法设计、调试和分析的综合素养。

二,问题描述

编程实现二叉树的下列基本运算。
(1)创建一棵二叉树;
(2)求二叉树中结点的总数;
(3)统计二叉树的叶结点个数;
(4)求二叉树的深度;
(5)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目;
(6)交换二叉树每个结点的左孩子和右孩子;
(7)输出二叉树。

三,基本要求

(1)采用二叉链表作为二叉树结点的存储结构;
(2)设计实现上述各种运算的算法;
(3)设计主函数以完成对上述算法的调用,并输出结果;
(4)完善参考程序;
(5)设计测试数据,上机调试、测试完善后的参考程序,保存并打印测试结果,对算法性能进行分析。

四,实验操作

1,双击Visual Studio程序快捷图标,启动程序。
在这里插入图片描述

2,之前创建过项目的话,直接打开即可,这里选择【创建新项目】。
在这里插入图片描述

3,单击选择【空项目】——单击【下一步】按钮。
在这里插入图片描述

4,编辑好项目的名称和存放路径,然后单击【创建】按钮。
在这里插入图片描述

5,创建C++程序文件,右击【源文件】——选择【添加】——【新建项】。
在这里插入图片描述
6,输入项目名称,单击【添加】按钮。
在这里插入图片描述

7,编写代码,单击运行按钮,运行程序。
在这里插入图片描述

五,示例代码

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>typedef struct BiTNode { 			// 定义二叉树的结点结构char data;   					// 假定树结点的元素类型为charstruct BiTNode* lchild; 			// 左指针struct BiTNode* rchild; 		// 右指针
} BiTNode, * BiTree;void CreateBiTree(BiTree& T)
{  // 先序递归遍历方式创建一棵二叉树char ch;scanf("\n%c", &ch);     								// 输入根结点的值if (ch == '#') 											// 终止项T = NULL;else{T = (BiTree)malloc(sizeof(BiTNode)); 				// 创建根结点if (!T)exit(-1);T->data = ch;printf("\n请输入%c结点的左子结点(#表无):", T->data); // 先序遍历创建左子树CreateBiTree(T->lchild);printf("\n请输入%c结点的右子结点(#表无):", T->data); // 先序遍历创建右子树CreateBiTree(T->rchild);}
}//统计二叉树的叶子结点个数。
int LeafNodeCount(BiTree T)
{if (T == NULL)return 0;                //如果是空树,则叶子结点个数为0else if (T->lchild == NULL && T->rchild == NULL) // 判断该结点是否是叶子结点(左孩子右孩子都为空),若是则返回1return 1;elsereturn LeafNodeCount(T->lchild) + LeafNodeCount(T->rchild);
}//交换二叉树每个结点的左孩子和右孩子。
void ChangeLR(BiTree T)
{BiTree p;if (T == NULL || (T->lchild == NULL && T->rchild == NULL))return;else{p = T->lchild;T->lchild = T->rchild;T->rchild = p;}ChangeLR(T->lchild);ChangeLR(T->rchild); // 交换右子树上结点的左右孩子
}
// 统计二叉树中度为1的结点数
int D1_Nodes(BiTree T)
{int  num1, num2;if (T == NULL || (!T->lchild && !T->rchild))return 0;num1 = D1_Nodes(T->lchild);num2 = D1_Nodes(T->rchild);if (T->lchild && !T->rchild)	// 若结点T的左子树非空,右子树空,则返回左// 子树上度为1的结点数加1(当前结点度为1)return num1 + 1;else if (!T->lchild && T->rchild)return num2 + 1;elsereturn num1 + num2;
}//求二叉树结点数目
int Nodes(BiTree  T)
{int num1, num2;if (T == NULL)return 0;else {num1 = Nodes(T->lchild);				// 统计左子树的结点数num2 = Nodes(T->rchild);				// 统计右子树的结点数return num1 + num2 + 1; // 左右子树结点总数加1(当前结点)}
}// 求二叉树的深度
int BiTreeDepth(BiTree T)
{int leftdep, rightdep;if (T == NULL) // 终止项return 0;else{leftdep = BiTreeDepth(T->lchild);rightdep = BiTreeDepth(T->rchild);return (leftdep > rightdep) ? (leftdep + 1) : (rightdep + 1);}
}
//以括号表示格式输出二叉树
void OutputBiTree(BiTree T)
{		// 先序递归遍历方式输出括号表示的二叉树if (T != NULL)									// 终止项{printf("%c", T->data);						// 访问根结点if (T->lchild != NULL || T->rchild != NULL){printf("(");							// 根的孩子用圆括号对括OutputBiTree(T->lchild);				// 先序遍历输出左子树if (T->rchild != NULL)printf(",");						// 根的左右孩子以“,”分隔OutputBiTree(T->rchild);				// 先序遍历输出右子树printf(")");							// 根的孩子用圆括号对括}}
}void main()
{int n;BiTNode* proot; 						// 定义树proot = NULL; 						// 初始化为空树printf("请输入根结点元素(#表无):");		// 创建二叉树CreateBiTree(proot);printf("\n(1)二叉树创建成功!其括号表示格式输出:\n\t");OutputBiTree(proot);printf("\n");n = Nodes(proot);printf("(2)二叉树结点总数是:%d\n", n);n = LeafNodeCount(proot);printf("(3)二叉树的叶子结点数为:%d\n", n);n = BiTreeDepth(proot);printf("(4)二叉树的深度是:%d\n", n);n = D1_Nodes(proot);printf("(5)二叉树中度为1的结点数是:%d\n", n);ChangeLR(proot);printf("(6)交换所有结点的左右孩子后二叉树括号表示法输出:\n\t");OutputBiTree(proot);printf("\n");
}

六,运行效果

1,实验测试效果。
在这里插入图片描述

2,编写代码运行后的效果。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直线轴承常规分类知多少?

直线轴承的分类方式多样&#xff0c;以下是从材质、结构形状和常规系列三个维度进行的具体分类&#xff1a; 按主要材质分类 外壳材质&#xff1a;常见的有不锈钢&#xff0c;具有良好的耐腐蚀性&#xff0c;适用于一些对环境要求较高、易受腐蚀的工作场景&#xff1b;轴承…

websocket和SSE学习记录

websocket学习记录 websocket使用场景 即时聊天在线文档协同编辑实施地图位置 从开发角度来学习websocket开发 即使通信项目 通过node建立简单的后端接口,利用fs&#xff0c; path&#xff0c; express app.get(*, (req, res) > {const assetsType req.url.split(/)[…

CUDA编程中影响性能的小细节总结

一、内存访问优化 合并内存访问&#xff1a;确保相邻线程访问连续内存地址&#xff08;全局内存对齐访问&#xff09;。优先使用共享内存&#xff08;Shared Memory&#xff09;减少全局内存访问。避免共享内存的Bank Conflict&#xff08;例如&#xff0c;使用padding或调整访…

【双指针】对撞指针 快慢指针 移动零

文章目录 双指针介绍对撞指针快慢指针283. 移动零解题思路算法思路算法流程双指针介绍 ​ 算法中的双指针,并不一定是指我们平常在 c/c++ 使用的指针类型,更多时候其实是数组的下标等,因为它们也是有标识某个元素的功能,通常我们也就顺其自然地称其为 “指针” ! ​ 常见…

数据结构0基础学习堆

文章目录 简介公式建立堆函数解释 堆排序O(n logn)topk问题 简介 堆是一种重要的数据结构&#xff0c;是一种完全二叉树&#xff0c;&#xff08;二叉树的内容后面会出&#xff09;&#xff0c; 堆分为大小堆&#xff0c;大堆&#xff0c;左右结点都小于根节点&#xff0c;&am…

4.17--4.19刷题记录(贪心)

第一部分&#xff1a;准备工作 代码随想录中解释为&#xff1a;贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 而我的理解为&#xff1a;贪心实质上是具有最优子结构的一种算法。所有的解都能由当前最优的解组成。 第二部分&#xff1a;开始刷题 &…

学习笔记十七——Rust 支持面向对象编程吗?

&#x1f9e0; Rust 支持面向对象编程吗&#xff1f; Rust 是一门多范式语言&#xff0c;主要以 安全、并发、函数式、系统级编程为核心目标&#xff0c;但它同时也支持面向对象的一些关键特性&#xff0c;比如&#xff1a; 特性传统 OOP&#xff08;如 Java/C&#xff09;Ru…

【Linux】43.网络基础(2.5)

文章目录 2.4 TCP/UDP对比2.4.1 用UDP实现可靠传输(经典面试题) 2.5 TCP 相关实验2.5.1 理解 listen 的第二个参数 2.4 TCP/UDP对比 我们说了TCP是可靠连接, 那么是不是TCP一定就优于UDP呢? TCP和UDP之间的优点和缺点, 不能简单, 绝对的进行比较TCP用于可靠传输的情况, 应用于…

three.js与webgl在buffer上的对应关系

一、three.js的类名 最近开始接触three.js 看到three.js中的一些类名和webgl的很相似 不自觉的就想对比一下 二、three.js中绘制4个点 // 创建点的几何体 const vertices new Float32Array([0.0, 0.0, 0.0, // 点11.0, 0.0, 0.0, // 点20.0, 1.0, 0.0, // 点30.…

DataWhale AI春训营 问题汇总

1.没用下载训练集导致出错&#xff0c;爆错如下。 这个时候需要去比赛官网下载对应的初赛训练集 unzip -d /mnt/workspace/sais_third_new_energy_baseline/data /mnt/workspace/sais_third_new_energy_baseline/初赛训练集.zip 在命令行执行这个命令解压 2.没定义测试集 te…

CANFD技术在新能源汽车通信网络中的应用与可靠性分析

一、引言 新能源汽车产业正处于快速发展阶段&#xff0c;其电子系统复杂度不断攀升&#xff0c;涵盖众多传感器、控制器与执行器。高效通信网络成为确保新能源汽车安全运行与智能功能实现的核心要素。传统CAN总线因带宽限制&#xff0c;难以满足高级驾驶辅助系统&#xff08;A…

Python字典深度解析:高效键值对数据管理指南

一、字典核心概念解析 1. 字典定义与特征 字典&#xff08;Dictionary&#xff09;是Python中​​基于哈希表实现​​的无序可变容器&#xff0c;通过键值对存储数据&#xff0c;具有以下核心特性&#xff1a; ​​键值对结构​​&#xff1a;{key: value}形式存储数据​​快…

C++中unique_lock和lock_guard区别

目录 1.自动锁定与解锁机制 2.灵活性 3.所有权转移 4.可与条件变量配合使用 5.性能开销 在 C 中&#xff0c;std::unique_lock 和 std::lock_guard 都属于标准库 <mutex> 中的互斥锁管理工具&#xff0c;用于简化互斥锁的使用并确保线程安全。但它们存在一些显著区别…

Nvidia显卡架构演进

1 简介 显示卡&#xff08;英语&#xff1a;Display Card&#xff09;简称显卡&#xff0c;也称图形卡&#xff08;Graphics Card&#xff09;&#xff0c;是个人电脑上以图形处理器&#xff08;GPU&#xff09;为核心的扩展卡&#xff0c;用途是提供中央处理器以外的微处理器帮…

下载electron 22.3.27 源码错误集锦

下载步骤同 electron源码下载及编译_electron源码编译-CSDN博客 问题1 从github 下载 dugite超时&#xff0c;原因没有找到 Validation failed. Expected 8ea2d0d3c9d9e4615069913207371ffe892dc10fb93975972f2f6e668f2e3b3a but got e3b0c44298fc1c149afbf4c8996fb92427ae41e…

洛谷P1120 小木棍

#算法/进阶搜索 思路: 首先,最初始想法,将我们需要枚举的长木棍个数计算出来,在dfs中,我们先判断,此时枚举这根长木棍需要的长度是否为0,如果为0,我们就枚举下一个根木棍,接着再判断,此时仍需要枚举的木棍个数是否为0,如果为0,代表我们这种方案可行,直接打印长木棍长度,接着我们…

Linux教程-常用命令系列二

文章目录 1. 系统管理常用命令1. useradd - 创建用户账户功能基本用法常用选项示例 2. passwd - 管理用户密码功能基本用法常用选项示例 3. kill - 终止进程功能基本用法常用信号示例 4. date - 显示和设置系统时间功能基本用法常用选项时间格式示例 5. bc - 高精度计算器功能基…

18、TimeDiff论文笔记

TimeDiff **1. 背景与动机****2. 扩散模型基础****3. TimeDiff 模型****3.1 前向扩散过程****3.2 后向去噪过程** 4、TimeDiff&#xff08;架构&#xff09;原理训练推理其他关键点解释 DDPM&#xff08;相关数学&#xff09;1、正态分布2、条件概率1. **与多个条件相关**&…

整合SSM——(SpringMVC+Spring+Mybatis)

目录 SSM整合 创建项目 导入依赖 配置文件 SpringConfig MyBatisConfig JdbcConfig ServletConfig SpringMvcConfig 功能模块 测试 业务层接口测试 控制层测试 SSM是Java Web开发中常用的三个主流框架组合的缩写&#xff0c;分别对应Spring、Spring MVC、MyBatis…

P1042【深基8,例1】乒乓球

【题目背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革&#xff0c;以推动乒乓球运动在全球的普及。其中 11 分制改革引起了很大的争议&#xff0c;有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位&#xff0c;他退役之后走上了乒乓球研究工作…