当前位置: 首页 > news >正文

【数据结构初阶】二叉树与堆(一)

文章目录

  • 一、树的基础概念
    • 1、节点与度数
    • 2、树的度与高度
    • 3、引入:数组下标为何从0开始
    • 4、祖先节点
    • 5、树是递归定义的
    • 6、树与非树的区别
    • 7、代码表示
  • 二、二叉树
    • 2.1、满二叉树
    • 2.2、完全二叉树
    • 2.3、完全二叉树的存储
  • 三、堆

一、树的基础概念

1、节点与度数

节点分为叶节点与分支节点

  • 度数:其子节点的个数
  • 叶节点:无子节点,即节点度数为0
  • 分支节点:度数不为0的节点

2、树的度与高度

  • 树的度:节点中度数最大的度数为树的度
  • 树的高度(深度):树的最大层次
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bg1ltLM8-1722609222670)(https://i-blog.csdnimg.cn/direct/1e7c57da3e6c473e9ee335e7e7056995.png)]

3、引入:数组下标为何从0开始

答:迫于无奈,方便计算。
已知:数组名=数组首元素的地址
且 a[i] = *( a+i )
若下标从1开始,那么首元素 = *( a+1 )该式显然不成立。

4、祖先节点

从我这个节点往上这条路径的节点均为我的祖先节点。

在这里插入图片描述

5、树是递归定义的

一个树可分为根和子树(度>=0)。
在这里插入图片描述

在这里插入图片描述

6、树与非树的区别

树:

  1. 子树间不相交
  2. 除根节点外,每个节点有且仅有一个母(父)节点

非树:子树间相交。

7、代码表示

存储方法:左孩子右兄弟模型(链表)

struct TreeNode
{int val;struct TreeNode* LeftChild;struct TreeNode* RightSister;
};

在这里插入图片描述

二、二叉树

1、定义:树的每个节点的度数最大为2
2、代码模型:左孩子右孩子(可参考左孩子右兄弟模型)

2.1、满二叉树

1、定义:每一层都是满的(2个节点),叶子只在最后一层。
2、第 k 层有 2^(k-1)个节点
总节点个数:2^k - 1
在这里插入图片描述

2.2、完全二叉树

1、定义:设二叉树的高度为k,其前k-1层都是满的,最后一层不满且从左到右必须是连续的。
2、满二叉树是特殊的完全二叉树。
在这里插入图片描述

2.3、完全二叉树的存储

物理结构:在内存中以数组的形式存储。
在这里插入图片描述

原理:在内存中存储以数组的形式,已知一个父节点,则它的后两个数据一定是它的子节点。

  • 1、局限
    只适用于完全/满二叉树,对非完全也可以,但存在很大的空间浪费。

  • 2、优点
    便于访问母(父)子关系
    已知父节点下标为 i
    则 左孩子下标为 2 * i+1, 右孩子下标为 2*i+2

    已知一个子节点的下标为 j
    1、j 为奇数时,为左孩子,父下标为 (j -1)/2
    2、j 为偶数时,为右孩子,父下标为 (j -2)/2
    但在C语言中,除后取整
    故可直接写为 (j -1)/2

三、堆

注:
1、堆是一个完全二叉树(可用数组存储)
2、C语言中的堆、栈是内存的划分,与数据结构中的堆(二叉树)、栈(后进先出)不一样

大堆:任何一个父节点都大于等于其子节点
小堆:任何一个父节点都小于等于其子节点
在这里插入图片描述

3、特点
可以直接得到极值。大堆:根是极大值,小堆:根是极小值。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【CN】Argo 持续集成和交付(二)
  • 为什么要设置 os.environ[“PYTHONHASHSEED“] = “0“,这样做具体会影响哪些随机值?
  • 观察者模式(Observer Pattern)
  • C# 设计模式之桥接模式
  • 新质生产力
  • PHP中如何定义常量以及常量和变量的主要区别
  • 海思35XX系列(三)sensor(传感器)
  • VUE框架面试整理-模板语法
  • EfficientNet-v2-s图像分类训练(简洁版)
  • DataX介绍
  • Python模块中的全局变量
  • Mecanim Animation System
  • Golang | Leetcode Golang题解之第310题最小高度树
  • 音视频入门基础:WAV专题(5)——FFmpeg源码中解码WAV Header的实现
  • Linux Socket TCP处理粘包问题
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 2018一半小结一波
  • Angular6错误 Service: No provider for Renderer2
  • css的样式优先级
  • hadoop集群管理系统搭建规划说明
  • Linux Process Manage
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • npx命令介绍
  • Shell编程
  • Spark学习笔记之相关记录
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 从输入URL到页面加载发生了什么
  • 计算机在识别图像时“看到”了什么?
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端临床手札——文件上传
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 在weex里面使用chart图表
  • 自制字幕遮挡器
  • 7行Python代码的人脸识别
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​香农与信息论三大定律
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (1)常见O(n^2)排序算法解析
  • (13)Hive调优——动态分区导致的小文件问题
  • (16)Reactor的测试——响应式Spring的道法术器
  • (70min)字节暑假实习二面(已挂)
  • (AngularJS)Angular 控制器之间通信初探
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (算法)区间调度问题
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET MVC 验证码
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net(C#)中String.Format如何使用
  • .net2005怎么读string形的xml,不是xml文件。
  • .net开发引用程序集提示没有强名称的解决办法