【C++天梯计划】1.10 二叉树(binary tree)

news2024/11/24 16:45:23

文章目录

    • 什么是二叉树?
    • 二叉树的定义
    • 二叉树的基本形态
    • 二叉树的性质
    • 例题1:二叉树的遍历
        • 题目描述
        • 输入
        • 输出
        • 样例
        • 代码
    • 例题2:哈夫曼树
        • 题目描述
        • 输入
        • 输出
        • 样例
        • 代码

🎆🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎆
今天我要开启一个新计划----【C++天梯计划】
目的是通过天梯计划,通过题目和知识点串联的方式,完成C++复习与巩固。

什么是二叉树?

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点 。

二叉树的定义

二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树 。

二叉树的基本形态

二叉树是递归定义的,其节点有左右子树之分,逻辑上二叉树有五种基本形态
1、空二叉树——如图(1)
2、只有一个根节点的二叉树——如图(2)
3、只有左子树——如图(3)
4、只有右子树——如图(4)
5、完全二叉树——如图(5)

1-----------2-----------------3---------------4------------------5

二叉树的性质

性质1: 二叉树的第i层上至多有2i-1(i≥1)个节点 [6] 。
性质2: 深度为h的二叉树中至多含有2h-1个节点 [6] 。
性质3: 若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1 [6] 。
性质4: 具有n个节点的满二叉树深为log2n+1。
性质5: 若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:
当i=1时,该节点为根,它无双亲节点。
当i>1时,该节点的双亲节点的编号为i/2 。
若2i≤n,则有编号为2i的左节点,否则没有左节点。
若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点 。

例题1:二叉树的遍历

题目描述

给出一个 nn 个结点的二叉树,请求出二叉树的前序遍历,中序遍历和后序遍历。

输入

第一行有一个整数 nn (0 < n ≤ 260<n≤26),表示二叉树有 nn 个结点;
以下 nn 行,每行第一个为一个大写字母表示结点的值,第 i+1i+1 行的结点编号为 ii ;
后面为两整数,第一个表示该结点左孩子结点编号,第二个表示该结点右孩子的结点编号,如果该编号为 00 表示没有;(编号为 11 的结点是树的根)

输出

共三行,第一行为二叉树的前序遍历,第二行为中序遍历,第三行为后序遍历;

样例

输入
7
F 2 3
C 4 5
E 0 6
A 0 0
D 7 0
G 0 0
B 0 0
输出
FCADBEG
ACBDFEG
ABDCGEF

代码

#include <bits/stdc++.h>
using namespace std;
//1.用孩子表示法,存储二叉树
//2.用递归的方法得到先序中序后序遍历的结果 
const int N = 30;
struct node{
	char c;
	int lc,rc;//左右孩子 
}a[N]; 
int n;

//前序遍历:根左右 
void dfs1(int x){
	cout<<a[x].c;
	if(a[x].lc) dfs1(a[x].lc);
	if(a[x].rc) dfs1(a[x].rc);
} 

//中序
void dfs2(int x){
	if(a[x].lc) dfs2(a[x].lc);
	cout<<a[x].c;
	if(a[x].rc) dfs2(a[x].rc);
}
//后序 
void dfs3(int x){
	if(a[x].lc) dfs3(a[x].lc);
	if(a[x].rc) dfs3(a[x].rc);
	cout<<a[x].c;
}

int main(){
	cin>>n;
	//读入结点
	for(int i = 1;i <= n;i++){
		cin>>a[i].c>>a[i].lc>>a[i].rc;
	} 
	
	//深搜
	//前序遍历
	dfs1(1);	
	cout<<endl;
	//中序遍历
	dfs2(1);
	cout<<endl;
	//后序遍历
	dfs3(1);
	return 0;
}

例题2:哈夫曼树

题目描述

哈夫曼树的定义是:一棵具有 nn 个带权叶结点的二叉树,使得所有叶结点的带权路径长度(叶结点 ×× 叶结点到根结点的路径长度)之和最小,这样的二叉树被称为最优二叉树,也称哈夫曼树。
在这里插入图片描述
比如:有 44 个结点的权值是55 44 22 99,可以构建出如下三颗不同的二叉树,第 22 棵二叉树的带权路径长度是最小的。
请读入一个整数 nn ,代表叶结点的数量,再读入 nn 个整数,代表叶结点的权值,请求出对应哈夫曼树的带权路径长度。

输入

输入的第一行包含一个正整数 nn(n≤100n≤100)。
接下来是 nn 个正整数,表示 nn 个叶结点的权值,每个数不超过 10001000 。

输出

输出构造出的哈夫曼树的带权路径长度。

样例

输入
5
5 3 8 2 9
输出
59

代码

#include <bits/stdc++.h>
using namespace std;
//思路:使用优先队列模拟哈夫曼树的构建过程
//小根堆 
priority_queue<int,vector<int>,greater<int> > q; 
int n,x,ans = 0;//ans:代表哈夫曼树的WPL的值 
 
int main(){
	cin>>n;
	//读入n个元素 
	while(n--){
		cin>>x;
		q.push(x);
	}
	
	//当队列中超过1个元素
	//获取队列头部的2个最小的元素
	int a,b; 
	while(q.size() > 1){
		a = q.top();
		q.pop();
		b = q.top();
		q.pop();
		
		ans += a + b;
		q.push(a+b);
	} 
	
	cout<<ans; 
	return 0;
}

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

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

相关文章

学成在线页面设计案例

html结构 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" content"widthdevice-width…

沉睡者IT - Web3采用现状:哪些企业采用了Web3,效果如何?

欢迎关注沉睡者IT&#xff0c;点上面关注我 ↑ ↑ 作为 Web 3 世界的“原住民”&#xff0c;我们已经能够看到个人和企业越来越多地尝试 Web 3 机制&#xff0c;推出 NFT、加密资产和数字商品。 了解他们为什么这样做、他们追求什么目标、哪些机制的效果最好和最差对我们来说…

python主题建模可视化LDA和T-SNE交互式可视化

我尝试使用Latent Dirichlet分配LDA来提取一些主题。 最近我们被客户要求撰写关于主题建模的研究报告&#xff0c;包括一些图形和统计输出。 本教程以自然语言处理流程为特色&#xff0c;从原始数据开始&#xff0c;准备&#xff0c;建模&#xff0c;可视化论文。 我们将涉及…

142.创建序列化类、序列化测试、反序列化测试

1.创建序列化类 什么是序列化&#xff0c;为什么要序列化&#xff1f; 当前web api应用中&#xff0c;前端要用到从后台返回的数据来渲染页面的时候&#xff0c;一般都是使用的json类型的数据&#xff0c;因为json类型简单直观便于理解&#xff0c;那么就需要在django框架中&am…

openEuler 通过 手工方式 安装 ceph 步骤

ceph集群在openEuler手工安装过程openEuler手工安装ceph 安装步骤前置要求1.openEuler版本2. Python 33. Systemd4. Time synchronization (such as chrony or NTP)5. LVM2 for provisioning storage devices安装1. 创建用户ceph2. 安装 ceph3. 生成配置项3.1 机器及组件规划列…

【Confluence】预览中文附件出现乱码,离线Linux下安装字体

what: confluence页面预览含有中文的附件时乱码 why&#xff1a;Linux服务器上 缺少中文字体 how&#xff1a; 一、安装字体 1、拷贝字体&#xff1a;linux上/usr/share/fonts/路径下新建目录msttcore&#xff0c;将windows的C:\Windows\Fonts的字体文件拷贝到/usr/share/fonts…

Mac Typora + PicGo + Github配置图床

Mac Typora PicGo Github配置图床 为了能把自己整理的博客发到CSDN上集集赞又介于一张张贴图很麻烦&#xff0c;所以搞了搞图床试试效果 下载PicGo 会魔法的建议直接爬长城&#xff1a;PicGo 不会魔法的用山大的镜像&#xff1a;PicGo Github图床设置 新建项目 随便起个…

详解:进程程序替换

目录一、前言二、什么是进程程序替换&#xff1f;三、进程程序替换的原理四、为什么要进行进程程序替换&#xff1f;五、如何进行进程程序替换&#xff1f;(常见进程程序替换系统调用接口)六、利用所学综合知识实现一个shell总结一、前言 一般情况下&#xff0c;对应的语言写的…

ELMO语言模型

ELMOELMO提出背景&#xff1a;解决一词多义问题。模型结构&#xff1a;双层双向的LSTM&#xff0c;字符卷积&#xff0c;第一层lstm表示更多的句法特征&#xff0c;第二层lstm表示更多的语义特征从ELMO开始以后学的语言模型都是预训练语言模型。预训练模型&#xff1a;1.预训练…

微机-------输入/输出接口(第六章)

目录 输入/输出接口概述输入/输出接口的功能CPU与输入/输出接口之间的信息⭐⭐输入/输出端口的编址方式统一编址独立编址输入/输出接口概述 CPU与外部设备进行信息交换时的困难: ①CPU和外设的速度差异非常大 ②CPU不能和外设直接通过引脚连接 注意: CPU和外设之间必须要设置…

5G LDPC polar 3GPP 定案过程

前言 看到中科大袁老师一段关于3GPP 组织 在 5G LDPC, polar 编解码定案过程&#xff0c;简单分享一下 一 简介 整个方案上百家公司整整争论了一年,最终定下来 其里碑阶段分3段如下&#xff1a; 二 主要争论点 当初主要有两大纠纷&#xff1a; 1&#xff1a; 数字信道 和控制…

基于thinkphp校园二手交易网站#毕业设计

随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 东方二手交易网站设计管理系统网站主要的功能模块包括首页、个人中心、卖家管理、买家信息管理、商品信息管理、订单信息管理、商品分类管理、系统管理…

基于51单片机电子微波炉控制系统(源程序+仿真+原理图+全套资料)

资料编号&#xff1a;203 功能介绍&#xff1a; 该电子微波炉采用51单片机制作&#xff0c;有基本的加热、冷却、启动、停止等功能&#xff0c;并通过MCU 控制其加热、冷却时间&#xff0c;LED 数码管显示时间。程序采用C语言编写&#xff0c;仿真使用Proteus&#xff0c;程序…

Redis的分布式锁问题(十)最强分布式锁工具:Redisson

Redisson的引入 我们先来看看之前的基于setnx实现的分布式锁存在的问题&#xff1a; 我们之前实现的分布式锁是基于redis的setnx命令的特性的&#xff01; 但是&#xff0c;这样子实现起来会有很多弊端&#xff01; 不可重入 简单的来说就是一旦setnx [key] [value]后&…

这才是图扑数字孪生污水处理厂该有的样子

近年来&#xff0c;智慧水务、数字水务成为水务行业的热点领域。对于污水处理领域&#xff0c;如何贯彻落实双碳战略&#xff0c;积极推进智慧水厂建设&#xff0c;显得尤为关键。 图扑软件依托自主研发的 HT for Web 产品&#xff0c;并结合视频融合、BIM、5G、物联网、云计算…

matplotlib 中子图subplot 绘图时标题重叠解决办法

引言 使用Python的matplotlib库绘制子图发现标题发生了重叠。 原来的代码&#xff1a; plt.rcParams[font.family][SimHei] datayear_genfor i in range(1,11):plt.subplot(5,2,i)typetype_df.index[:][i-1]setplot_TypeTime(i,data,type)plt.show()上网上寻找解决办法。 按照…

Allegro添加渐近线操作指导

Allegro添加渐近线操作指导 Allegro支持添加渐近线,让线宽变化的地方进行圆环的过渡,对于射频信号优化有很大帮助,类似下图 具体操作如下 首先设置参数,route-Gloss-Parameters 点击Fillet and Taper Trace前面的方框 勾选Allowed DRC, Unused Nets 勾选Tapered Trac…

BLUElegend传奇引擎不使用路由器架设单传奇的办法

使用BLUE LEGEND架设传奇私发服单机的朋友&#xff0c;是不是因为找不到路由器而无法架设单机服务端呢&#xff0c;这里介绍一种方法不需要买路由器来架设。 为什么LEG引擎需要路由器才能架设呢&#xff1f; 网上找了很多教程都得不到答案&#xff0c;有些人说是为了固定ip地址…

[附源码]计算机毕业设计SpringBoot网上鲜花购物系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

leetcode-每日一题-1779-找到最近的有相同 X 或 Y 坐标的点(简单,数学思想)

今天这道每日一题很简单&#xff0c;没啥可说的&#xff0c;细心点即可 1779. 找到最近的有相同 X 或 Y 坐标的点 难度简单73收藏分享切换为英文接收动态反馈 给你两个整数 x 和 y &#xff0c;表示你在一个笛卡尔坐标系下的 (x, y) 处。同时&#xff0c;在同一个坐标系下给你一…