【数据结构课程学习】二叉树_堆:Lesson2

🎁个人主页:我们的五年

🔍系列专栏:数据结构课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

 1.二插树的概念和结构

🚗二叉树的概念:

🚗特殊的二叉树:

🚗二叉树的性质:

🚗二叉树的几个理论题:

🚗二叉树的存储结构:

2.堆:

二叉树基本的函数:

🏝头文件和堆的结构定义:

🏝1.初始化堆:

🏝2.堆的销毁:

🏝3.堆的插入:

🏝4.删除堆顶元素:


 1.二插树的概念和结构

🚗二叉树的概念:

●二叉树中所以的节点的度都小于2,也就是一个父节点最大两个子节点。

●二叉树是一种有序结构,左孩子和有孩子颠倒,二叉树是有序树。

●树是递归定义的,所以二叉树也可以一直往下分,而且每一个节点最多也只能分成左右两个部分。

二叉树由下面几种情况组成:空树,只有根节点,只有左子树,只有有子树,左右子树

因为左右孩子不能颠倒,所以左子树和右子树是不一样的。

🚗特殊的二叉树:

可以把根节点看成第树的第1层,也可以看成树的第0层。但是把根节点看成第0层,那么是空树的时候,树的深度为-1。这样定义的话就比较别扭,所以还是把根节点定义为树的第一层。

🚀满二叉树:

每一层达到最大节点数的时候,为满二叉树。也就是第n层最多的节点数为2^(n-1)个。n层的满二叉树,总节点为2^n  -1个。

🚀完全二叉树:
完全二叉树可以看成是从满二叉树截取出来的,完全二叉树里的节点和满二叉树的节点一一对应。即每一层都要从最左边往右边定义,而且先是左孩子,然后再是右孩子。

🚗二叉树的性质:

规定根的节点层级为1

●一棵非空二叉树的第n层最多有2^(n-1)个节点,总节点最多为2^n-1。

当只有根节点的时候,叶子节点为M个,度为2的节点为N个。所以只有根节点的时候,叶子节点为M=1,度为2的节点为N=0。所以M=N+1。然后在任何情况下,增加一个叶子节点,度为2的节点也会增加一个。所以二叉树中,任何非空情况下都有:

叶子节点数=度为2的节点数+1

●有N个节点,那么就有(N-1)条边。因为除了根节点以外,每增加一个节点就要增加一条边。

具有n个结点的满二叉树的深度,h=log2(n+1)。

●从树从上到下,从左到右进行编号,根节点编号为0,一共有N个节点,最大序号为N-1那么有下面结论:

1.除了根节点以外,其他的都有父节点,那么第i个节点的父节点的序号为:(i-1)/2。

2.如果第i个节点,2*i+1<N,那么2*i+1为i节点的左孩子,如果大于等于N,那么没有左孩子。

3.如果第i个节点,2*i+2<N,那么2*i+2为i节点的右孩子,如果大于等于N,那么没有右孩子。

🚗二叉树的几个理论题:

1. 某二叉树共有 399 个结点,其中有 199 个 度为 2 的结点 ,则该二叉树中的 叶子结点数 为( B)
A 不存在这样的二叉树
B 200
C 198
D 199
解:B。因为除了空树以外,其他情况下都有: 叶子节点数=度为2的节点数+1 ,度为2的节点数为199,那么叶子节点为200。

 2.下列数据结构中,不适合采用顺序存储结构的是(A )

A 非完全二叉树
B 堆
C 队列
D 栈
解:A。因为如果连完全二叉树都不是,定义的顺序就不是满足从左到右,从上到下。这样用顺序存储就不太合适,如果是完全二叉树,用数组存储还是可以的。
3.在具有 2n 个结点的完全二叉树中,叶子结点个数为(B )
A n
B n+1
C n-1
D n/2
解:B。因为节点数是2n个,是偶数个,又是完全二叉树,所以只有一个节点的度为1,其他的要么是叶子节点,要么是度为2的节点,所以有: 度为2的节点+叶子节点+1=叶子节点-1+叶子节点+1=2*叶子节点=2n,所以叶子节点为n个。

4.一棵完全二叉树的结点数位为531个,那么这棵树的高度为( B)
A 11
B 10
C 8
D 12
解:B。当高度为9的满二叉树节点总数为2^9-1=511,高度为10的满二叉树的总节点为2^10-1=1023,531在511和1023之间,所以这棵树的高度为10。
5.一个具有767个结点的完全二叉树,其叶子结点个数为(B)
A 383
B 384
C 385
D 386
解:B。767个节点,与第三题差不多,但是是奇数个节点,那么所以节点的度都是2,所以有: 度为2的节点数+叶子节点数=767,度为2的节点数+1=叶子节点数。所以叶子节点*2-1=767,所以叶子节点为384。

🚗二叉树的存储结构:

1.顺序存储:

顺序存储时使用数组来存储,完全二叉树适合用数组存储。这时候在物理层面上看时数组,从逻辑上看是一课二叉树。不是完全二叉树会存在空间浪费。

2.链式存储:

用链表来存储二叉树,即用链的逻辑关系来存储二叉树。链表的结构里一般存这数据,左孩子的地址,右兄弟的地址。

//二叉链
struct BinaryTreeNode {int x;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
};//三叉链
struct BinaryTreeNode {int x;struct BinaryTreeNode* left;struct BinaryTreeNode* right;struct BinaryTreeNode* parent;
};

2.堆:

1.堆是一棵完全二叉树。

2.堆的父节点总是大于等于或者小于等于子节点。

二叉树基本的函数:

🏝头文件和堆的结构定义:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int HPDataType;typedef struct HP {HPDataType* a;int size;size_t capacity;
}HP;//堆的初始化
void HPInit(HP* php);//堆的销毁
void HPDestroy(HP* php);//堆的插入,一小堆为例,小堆:父节点都小于子节点
void HPPush(HP* php, HPDataType x);//取堆顶元素,小堆取的是最小值,大堆取的是最大值
HPDataType HPTop(HP* php);//删除堆顶的数据
void HPPop(HP* php);//判空函数
bool HPEmpty(HP* php);

🏝1.初始化堆:

void HPInit(HP* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}

🏝2.堆的销毁:

//堆的销毁
void HPDestroy(HP* php)
{assert(php);free(php->a);php->capacity = php->size = 0;
}

🏝3.堆的插入:

向上调整函数是往上遍历,当父节点大于子节点,就进行交换数据,循环结束的条件是当孩子节点到达根节点,一直这样循环就可以符合小堆的结构。每次调整都把最小的往上移。

//交换两个数的函数
void Swap(HPDataType* px, HPDataType* py)
{HPDataType tmp = *px;*px = *py;*py = tmp;
}//向上调整函数
void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0)    //如果循环的条件为parent>=0,循环也会巧合的结束,但是这种情况是不可取的{if (a[parent] > a[child]){Swap(&a[parent], &a[child]);child = parent;parent = (parent - 1) / 2;}else{break;}}
}//堆的插入,以小堆为例,小堆:父节点都小于子节点
void HPPush(HP* php, HPDataType x)
{assert(php);if (php->capacity == php->size){size_t newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = realloc(php->a, newcapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc");return;}php->a = tmp;php->capacity = newcapacity;}php->a[php->size++] = x;AdjustUp(php->a,php->size - 1);
}

🏝4.删除堆顶元素:

//交换两个数的函数
void Swap(HPDataType* px, HPDataType* py)
{HPDataType tmp = *px;*px = *py;*py = tmp;
}//向下调整
void AdjustDown(HPDataType* a, int size)
{//假设法,先假设左孩子比右孩子小int parent = 0;int child =  parent* 2 + 1;while (child < size){if (child+1<size&&a[child + 1] < a[child]){++child;}if (a[parent] > a[child]){Swap(&a[parent], &a[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}//删除堆顶的数据
void HPPop(HP* php)
{//先交换堆顶元素和堆的最后一个元素php->size--;Swap(&php->a[0], &php->a[php->size]);AdjustDown(php->a, php->size);
}

🏝5.取堆顶元素和判空元素:

//删除堆顶的数据
void HPPop(HP* php)
{//先交换堆顶元素和堆的最后一个元素php->size--;Swap(&php->a[0], &php->a[php->size]);AdjustDown(php->a, php->size);
}//判空函数
bool HPEmpty(HP* php)
{assert(php);return php->size == 0;
}

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

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

相关文章

LVS精益价值管理系统 DownLoad.aspx 任意文件读取漏洞复现

0x01 产品简介 LVS精益价值管理系统是杭州吉拉科技有限公司研发的一款专注于企业精益化管理和价值流优化的解决方案。该系统通过集成先进的数据分析工具、可视化的价值流映射技术和灵活的流程改善机制&#xff0c;帮助企业实现高效、低耗、高质量的生产和服务。 0x02 漏洞概述…

ssms用户登陆失败,服务器处于单用户模式。目前只有一位管理员能够连接。解决方案

文章目录 问题解决方案单用户模式什么是单用户模式&#xff1f;为什么使用单用户模式&#xff1f;实现步骤 问题 连接smss的时候发现无法连接&#xff0c;显示 服务器处于单用户模式。目前只有一位管理员能够连接 解决方案 打开SQL Server配置管理器 右键属性 在启动参数的最…

Pycharm2024搭建QT6开发环境

创建pyqt6虚拟环境 首先&#xff0c;创建一个qt6的虚拟环境&#xff1a; conda create --name pyqt6 python3.11.7激活环境&#xff1a; conda activate pyqt6安装pyqt6 安装pyqt6&#xff1a; pip install pyqt6创建代码目录 创建目录&#xff1a; 使用pycharm打开这个…

etcd集群部署

1.etcd介绍 1.1 什么是etcd etcd的官方定义如下: A distributed, reliable key-value store for the most critical data of distributed systemetcd是一个Go语言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值(key value)存储、配置共享和服务发现等…

Selenium 自动化测试工具(1) (Selenium 工作原理,常用API的使用)

文章目录 什么是自动化测试什么是测试工具&#xff1a;Selenium 工作原理(重要)Selenium API定位元素CSS 选择器xpath 定位元素 通过Java代码实现自动化1. 定位元素2. 关闭浏览器3. 获取元素文本4. 鼠标点击与键盘输入5. 清空内容6.打印信息 什么是自动化测试 关于自动化&…

UEFI EDK2源码学习(一)——环境安装

部署环境 vmvare15.0 ubuntu20.04 docker edk2 源码 具体步骤 docker安装 # 更新apt软件包索引 sudo apt-get update# 添加docker依赖 sudo apt-get install -y \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common# 添加docker 官方…

2.Redis之Redis的背景知识

Redis 是一个在内存中存储数据的中间件 用于作为数据库,用于作为数据缓存. 在分布式系统中能够大展拳脚~ 1.Redis的特性介绍(优点) 1.1 在内存中存储数据 MySQL 主要是通过"表"的方式来存储组织数据的,"关系型数据库" Redis 主要是通过“键值对" 的…

IP数据云确认参展2024 ChinaJoy BTOB与诸位共展未来!

作为在全球数字娱乐领域兼具知名度与影响力的年度盛会&#xff0c;2024年第二十一届ChinaJoy BTOB将于7月26日至7月28日在上海新国际博览中心盛大召开&#xff0c;秉承着初心“游”在&#xff0c;精彩无限&#xff01;&#xff08;英译&#xff1a;Stay True, Game On.&#xf…

三、ESP32-IDF之LED

实现 ESP32-S3 的 IO 作为输出功能&#xff0c;实现LED灯以500毫秒闪烁一次 1、GPIO&LED简介 1.1、GPIO简介 GPIO 是负责控制或采集外部器件信息的外设&#xff0c;主要负责输入输出功能。 1.2、LED简介 LED&#xff0c;即发光二极管。 2、硬件设计 (1)原理图 LED 接…

【css3】04-css3转换

目录 1 2D转换 2 3D转换 3 案例&#xff1a;旋转的魔方 1 2D转换 ## 2D转换 ☞ 位移 transform: translate(100px,100px); 备注&#xff1a; 位移是相对元素自身的位置发生位置改变 ☞ 旋转 transform: rotate(60deg); 备注&am…

嵌入式实时操作系统笔记3:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程

上文讲到UC/OS III系统的移植&#xff0c;那篇文章是失败了的&#xff0c;网络上的资料真是层次不清&#xff0c;多有遗漏步骤&#xff0c;导致单片机连操作系统的初始化都卡在那&#xff0c;这次换个赛道&#xff0c;学FreeRTOS吧...... 今日任务如标题所示&#xff1a;FreeR…

QTextCodec NO such file or directory让qt6兼容qt5

首先在.pro 文件中新加 QT core5compat这时会报错 链接 报错之后修复qt&#xff0c;新加兼容模块&#xff0c;见链接。

电脑怎么录屏?电脑录屏的7个方法,仅3%的人知道!

你知道电脑怎么录屏吗&#xff1f;在电脑上录屏是向朋友展示炫酷游戏技巧、制作软件教程视频和展示数字艺术技巧的好方法。遗憾的是&#xff0c;屏幕录制并不像截屏那么简单。然而&#xff0c;无论你是在寻找在电脑上录制屏幕&#xff0c;亦或是录制音频的方法&#xff0c;还是…

【代码随想录】二分查找算法总结篇

目录 前言二分查找例题一例题二例题三例题四 前言 本篇文章记录了代码随想录二分查找算法的总结笔记&#xff0c;下面我们一起来学习吧&#xff01;&#xff01; 二分查找 关于二分查找算法&#xff0c;我在之前的这篇博客里面做了非常多的分析&#xff0c;但是后面做题做着…

List Control控件绑定变量

创建基于对话框的mfc项目 添加 List Control控件 右击控件&#xff0c;选择“添加变量” 在初始化对话框代码中增加一些代码 BOOL CMFCApplication3Dlg::OnInitDialog() { //...// TODO: 在此添加额外的初始化代码DWORD dwStyle m_programLangList.GetExtendedStyle(); …

初识Spring Boot

初识Spring Boot SpringBoot是建立在Spring框架之上的一个项目,它的目标是简化Spring应用程序的初始搭建以及开发过程。 对比Spring Spring Boot作为Spring框架的一个模块&#xff0c;旨在简化Spring应用程序的初始搭建和开发过程&#xff0c;以下是Spring Boot相对于传统Spri…

AI视频教程下载:用提示工程在GPT商店构建10个GPTs

你将学到什么&#xff1f; 深入了解ChatGPT平台和GPT商店的生态系统。 开发为多样化应用定制GPT模型的专业知识。 掌握高效内容生成的AI自动化技术。 学习高级提示工程以优化ChatGPT输出。 获取构建AI驱动的数字营销和广告解决方案的技能。 了解如何为SEO写作和优化创建专…

Redis篇 redis基本命令和定时器原理

基本命令和定时器原理 一. exists命令二. del命令三. Expire命令四. ttl命令五. redis的过期策略六. 定时器的两种设计方式七. type命令 一. exists命令 用来判断key的值是否存在 返回值是key的个数 这样写的话&#xff0c;有没有什么区别呢&#xff1f; 效率变低&#xff0c;消…

AI办公自动化:用kimi将子文件夹里面的文件批量重命名

工作任务和目标&#xff1a;一个文件夹下有多个子文件夹 子文件夹中有多个srt文件&#xff0c;需要删除文件名中的english和空格 第一步&#xff0c;在kimi中输入如下提示词&#xff1a; 你是一个Python编程高手&#xff0c;一步步的思考&#xff0c;来编写下面任务的Python脚…

概率论统计——大数定律

大数定律 弱大数定律&#xff08;辛钦大数定律&#xff09; 利用切比雪夫不等式&#xff0c;证明弱大数定律 应用 伯努利大数定理&#xff0c;&#xff08;辛钦大数定理的推论&#xff09; 证明伯努利大数定理 注意&#xff1a;这里将二项分布转化成0,1分布来表示&#xff0c;…