【数据结构之树和二叉树】

数据结构学习笔记---007

  • 数据结构之树和二叉树概念篇
    • 1、树的概念和结构
      • 1.1、树的相关概念
      • 1.2、树的存储结构
    • 2、二叉树概念及结构
      • 2.1、二叉树概念
      • 2.2、满二叉树
      • 2.3、完全二叉树
      • 2.4、满二叉树或完全二叉树的存储形式
    • 3、堆的概念及结构
      • 3.1、堆的性质
      • 3.2、堆的意义
    • 4、二叉树的存储形式
      • 4.1、二叉树的数组存储形式
      • 4.2、二叉树的链式存储结构
      • 4.3、树、森林与二叉树之间的相互转换
        • 4.3.1、树转换为二叉树
        • 4.3.2、森林转换为二叉树
        • 4.3.3、二叉树转换为树或森林
    • 5、二叉树的基本性质
      • 5.1、二叉树性质练习题

数据结构之树和二叉树概念篇

前言:
前篇学习了 数据结构的栈和队列,那么这篇继续学习树及其相关内容基础内容。

/知识点汇总/

1、树的概念和结构

概念:树是一种非线性结构,是由有限个节点组成的具有层次关系的集合。倒立的树模样。
有一个特殊的结点,称为根节点,根节点没有前驱。
另外的子树有且只有一个前驱,可以有0个或多个后继。
因此树是递归定义的。根在上,叶在下。

1.1、树的相关概念

结点的度:一个结点的度就是结点含有的子树个数,称为该结点的度。
叶子节点或称为终端结点:度为0的结点就是叶子节点,也就是没有孩子的结点。
非终端结点或称为分支结点:度不为0的结点。
双亲结点或父节点:若一个结点含有子节点,则该节点称为其子节点的父节点。
孩子节点或子节点:一个结点含有的子树的根结点称为该结点的子节点。
兄弟结点:具有相同父节点的结点互称为兄弟结点。
树的度:一棵树中,最大的结点的度称为树的度。
结点的层次:从根结点开始定义:根一般为第一层,根的子结点为第二层,依次类推
树的高度或深度:树中各结点的最大层次,为该结点的深度。
堂兄弟结点:双亲位于同一层的结点为堂兄弟结点。
结点的祖先:从根结点到该结点所经分支上的所有结点都是该结点的祖先
子孙:以某结点为根的子树中任一结点都称为该结点的子孙。
森林:由若干棵互不相交的树的集合称为森林。可有树去掉根结点转化。

那么树的实现,该如何表示呢?用数组?用链表?

1.2、树的存储结构

三种方法,假设树的度为6
方法一:

#define N 6
struct TreeNode
{int val;struct TreeNode* childArr[N];//指针数组
};

方法二:

struct TreeNode
{int val;SeqList childSL;//顺序表//SeqList,C++的库可调用
};

方法三,最优方法:左孩子右兄弟表示法

struct TreeNode
{int val;struct TreeNode* leftChild;struct TreeNode* rightBother;
};

2、二叉树概念及结构

2.1、二叉树概念

一颗二叉树是结点的一个有限集合,该集合

1.或者为空
2.或由一个根结点加上两棵,别称为,左子树和右子树的二叉树组成。
3.二叉树不存在度大于2的结点
4.二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

注意:对于任意的二叉树都是由一下几种情况复合而成的。

1.空树
2.只有根节点
3.只有左子树
4.只有右子树
5.左右子树均存在
二叉树的度不一定为2,但度为2一定是二叉树。
因为二叉树的度最大为2,即0~2

2.2、满二叉树

一颗二叉树,如果每一层的结点树达到最大值,那么这个二叉树就是满二叉树。
层数为:k,那么结点总数就是:2^k-1个结点
每一层都是满的,即除了叶子结点,其余所有结点的度都是2,因为只有度为0或度为2的结点。

2.3、完全二叉树

完全二叉树是效率很高的数据结构,对于深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,被称为完全二叉树,满二叉树是一种特殊的完全二叉树。

完全二叉树叶子节点只可能出现在最下层或次下层,并且最下层的叶子节点都位于左孩子(因为要保持连续性,不能颠倒)。
前n-1层是满的,最后一层不一定满(因为满二叉树是完全二叉树的特殊情况),但是从左到右必须是连续的。

高度为h的完全二叉树第h层的结点数:
最多就是:2^h - 1
最少为:2^(h-1)-1+1
即:[2^(h-1), 2^h-1]

2.4、满二叉树或完全二叉树的存储形式

1.数组 — 一层一层的存储
父子结点的关系

左孩子 = 父结点2 +1 //奇数
右孩子 = 父结点
2+2 //偶数

或者由孩子结点推父结点

父结点 = (孩子结点-1)/2

所以非完全二叉树不适合数组结构的存储,知识和链式结构存储

3、堆的概念及结构

一般是把数组数据看作一颗完全二叉树,并有以下要求

小堆:任意一个父亲 <= 孩子
大堆:任意一个父亲 >= 孩子

3.1、堆的性质

1.堆中某个结点的值总是不大于或不小于其父结点的值
2.堆总是一颗完全二叉树

练习题1:

下列关键字序列为堆的是:
A 100 60 70 50 32 65
B 60 70 65 50 32 100
C 65 100 70 32 50 60
D 70 65 100 32 50 60举例:
A满足:10060      70
50  32   65

小结:
所以有序数组是堆,但堆不一定有序;并且这里的堆和内存空间的堆不是同一个意义。

3.2、堆的意义

  1. 堆的排序 O(N*log^N) – 根结点是该数的最大值
  2. top k问题 – 便于求顶点问题的解决
  3. 搜索

4、二叉树的存储形式

4.1、二叉树的数组存储形式

一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费等问题。
并且实际应用中,也只有堆会用数组的形式存储
即二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

4.2、二叉树的链式存储结构

用链表来指示元素的逻辑关系
通常,以链表中的每一个结点,三个域组成,分别是数据域、左指针域和右指针域,左指针指向左孩子,右指针指向右孩子。
链式结构也分为二叉链和三叉链,一般是二叉链。高阶数据结构涉及三叉链。

补充知识点(备注:后面抽空单独写篇学习该部分知识点)

1.搜素二叉树:对于根节点来说,根节点的左子树都小于根结点,根节点的右子树都大于根节点。 最多查找高度次。
2.森林:是m(m≥0)棵互不相交的树的集合,其次森林是由树构成的。
3.最优二叉树(哈夫曼树):带权路径最小的二叉树称为最优二叉树,也称为哈夫曼树。
3.1.带权路径长度:设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和,称为带权路径长度。
3.2.哈夫曼树的定义:一棵二叉树要使其带权路径长度最小,必须使权值越大的叶子节点越靠近根节点,权值越小的叶子节点越远离根节点,并且不存在度为1的结点。
4.线索二叉树:加上线索的二叉树称为线索链表,也称为线索二叉树。
4.1.线索:考虑到具有n个结点的二叉链表,在2n个指针域中只有n-1个指针域用来存储孩子节点的地址,存在n+1个空指针域,可以利用这些空指针指向该节点在某种遍历序列中的前驱或后继结点,这些指向前驱和后继结点的指针称为线索,加上线索的二叉链表就是线索链表或线索二叉树。

4.3、树、森林与二叉树之间的相互转换

4.3.1、树转换为二叉树

一般步骤
1.加线:树中所有相邻兄弟结点之间加一条线;
2.去线:对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点之间的连线;
3.层次调整:按照二叉树结点之间的关系进行层次调整。
样例流程图,如下所示
在这里插入图片描述

4.3.2、森林转换为二叉树

一般步骤
1.将森林中的每根树转换为二叉树;
2.将每棵树的根结点视为兄弟,在所有根节点之间加上连线;
3.按照二叉树结点之间的关系进行层次调整。
样例流程图,如下所示
在这里插入图片描述

4.3.3、二叉树转换为树或森林

一般步骤
1.加线:若某结点x是其双亲y的左孩子,则把结点x的右孩子、右孩子的右孩子…都与结点y用线连接;
2.去线:删去原来二叉树中所有的双亲结点与右孩子结点的连线;
3.层次调整:整理1和2步骤,使之层次分明,得到树或森林。
样例流程图,如下所示
在这里插入图片描述

5、二叉树的基本性质

二叉树的5个基本性质:

1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点。
2.若规定根节点的层数为1,则深度为h的二叉树的最大节点数为2^h - 1个(等比数列推导)
3.对任何一棵二叉树,如果度为0其叶子节点个数为n0,度为2的分支节点个数为n2,则有n0 = n2 + 1;
4.若规定根节点的层数为1,具有n个结点的满二叉树的深度,h = log2^n+1。
5.对于具有n个结点的完全二叉树,如果按照从上至下,从左至右的数组顺序对所有结点从0开始编导,则对于序号为i的节点有:
1)若i>0,i位置节点的双亲序号为:(i-1)/2 , i = 0时i为根节点编号,无双亲节点;
2)若2i+1<n,左孩子序号为:2i+1,2i+1>=n,否则无左孩子;
3)若2i+2<n,右孩子序号为:2i+2,2i+2>=n,否则为右孩子。

补充
增加一个度为2的结点,一定增加一个度为0的结点。
增加一个度为1的结点,一定减少一个度为0的结点,增加一个度为0的结点.

5.1、二叉树性质练习题

第一题:
某二叉树共有399个节点,其中有199个度为2的节点,则该二叉树中的叶子节点数为()
A.不存在这样的二叉树 B.200 C.198 D.199

第二题:
下列数据结构中,不适合采用顺序存储结构的是()
A.非完全二叉树 B.堆 C.队列 D.栈

第三题:
在具有2n个节点的完全二叉树中,叶子节点个数为()
A.n B.n+1 C.n-1 D.n/2

第四题:
一颗完全二叉树的节点数为531个,那么这颗数的高度为()
A.11 B.10 C. 8 D.12

第五题:
一个具有767个节点的完全二叉树,其中叶子节点个数为()
A.383 B.384 C.385 D.386
参考答案:1.B 2.A 3.B 4.B 5.B

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

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

相关文章

python_selenium_安装基础学习

目录 1.为什么使用selenium 2.安装selenium 2.1Chrome浏览器 2.2驱动 2.3下载selenium 2.4测试连接 3.selenium元素定位 3.1根据id来找到对象 3.2根据标签属性的属性值来获取对象 3.3根据xpath语句来获取对象 3.4根据标签的名字获取对象 3.5使用bs4的语法来获取对象…

解惑:测试圈网红工具 Jmeter 到底难在哪里

作为一名测试人员&#xff0c;你是否也曾经遇到过这些问题&#xff1a; 同样的起点&#xff0c;同样的工作时间&#xff0c;为什么别人接那么多项目&#xff0c;你还是在点点点&#xff1b;为什么别人升职了&#xff0c;而你还在原地踏步&#xff1f; 同样的工作内容&#xf…

数据库的数据类型

文章目录 前言一、数据类型数据类型分类数值类型bit类型小数类型floatdecimal 字符串类型charvarcharchar和varchar比较 日期和时间类型enum和set 前言 一、数据类型 数据类型分类 数值类型 下面我们来创建一个表&#xff0c;表中创建一个tinyint类型的数据。当我们不指定tiny…

【贪心】重构字符串

/*** 思路&#xff1a;如果s长度小于2&#xff0c;直接返回s&#xff0c;假设字符串s的长度为n。* n为偶数&#xff0c;如果字符串中的某个字符数量超过 n/2 则肯定会存在相邻的字符。* n为奇数&#xff0c;如果字符串中的某个字符的数量超过 &#xff08;n1&am…

机器学习顶会ICML 2024今日开放投稿,CCF A类,中稿率27.94%(附ICML23杰出论文+18篇高分论文)

ICML 2024今天开放投稿了&#xff01;距离截稿还有24天&#xff0c;想冲ICML的同学速度&#xff01; ICML 全称 International Conference on Machine Learning&#xff0c;由国际机器学习学会&#xff08;IMLS&#xff09;举办&#xff0c;与NIPS一同被认为是人工智能、机器学…

debian 11 arm64 aarch64 D2000 平台编译 box86 box64 笔记

参考资料 https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md 源码地址 GitHub - ptitSeb/box86: Box86 - Linux Userspace x86 Emulator with a twist, targeted at ARM Linux devices deb在线源地址&#xff08;打不开&#xff09;&#xff1a; Itais box86…

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

一文解析低代码平台

一、低代码概念 低代码开发平台是一种无需编码或者只需要少量代码即可快速生成应用程序的开发平台&#xff0c;通过可视化进行应用程序开发的方法&#xff0c;让不同经验水平的开发人员可以通过图形化的用户界面&#xff0c;使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程…

MySQL夯实之路-存储引擎深入浅出

innoDB Mysql4.1以后的版本将表的数据和索引放在单独的文件中 采用mvcc来支持高并发&#xff0c;实现了四个标准的隔离级别&#xff0c;默认为可重复读&#xff0c;并且通过间隙锁&#xff08;next-key locking&#xff09;策略防止幻读&#xff08;查询的行中的间隙也会锁定…

Redis:原理速成+项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战12&#xff08;好友关注、Feed流&#xff08;关注推送&#xff09;、滚动分页查…

基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于ssm的校园预点餐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

大语言模型向量数据库

大语言模型&向量数据库 LARGE LANGUAGE MODELSA. Vector Database & LLM WorkflowB. Vector Database for LLMC. Potential Applications for Vector Database on LLMD. Potential Applications for LLM on Vector DatabaseE. Retrieval-Based LLMF. Synergized Exampl…

element+vue 之图片放大器

1.安装插件 npm install vue-photo-zoom-pro2.main.js导入 // 放大镜 import VuePhotoZoomPro from vue-photo-zoom-pro Vue.use(VuePhotoZoomPro)3.页面使用 <vue-photo-zoom-pro:url"imgUrl":out-zoomer"true":scale"2"style"width:…

Leetcode202快乐数(java实现)

今天分享的题目是快乐数&#xff1a; 快乐数的定义如下&#xff1a; 快乐数&#xff08;Happy Number&#xff09;是指一个正整数&#xff0c;将其替换为各个位上数字的平方和&#xff0c;重复这个过程直到最后得到的结果为1&#xff0c;或者无限循环但不包含1。如果最终结果为…

使用ElementUI的el-tab+vxe-table表格+复选框选择

效果&#xff1a; 功能&#xff1a;首先进来是全部清空的状态的 点击左边选择不同项右边会实时发送接口获取数据填充表格 复选的内容可以保留显示&#xff0c;比如A的1勾选后切换到B再切换回来A的1仍然是勾选状态 说实话官网的setCheckboxRow方法我实现不了&#xff0c;这里…

2024年华夏银行总行社会招聘公告

信息科技部自动化测试与开发类岗  工作地点&#xff1a;北京市 学历要求&#xff1a;本科及以上 工作职责 1、持续推进自动化测试的开展&#xff0c;提升自动化测试覆盖率,包括方案设计、测试分析、测试执行和总结等。 2、负责自动化测试工具和框架搭建&#xff0c;根据…

CSAPP阅读笔记-信息的表示和处理

信息的表示和处理 包括整数、浮点数的存储格式、计算中可能存在的问题等 信息存储 大多数计算机使用8位的块&#xff0c;或者字节(byte)&#xff0c;作为最小的可寻址的内存单位&#xff0c;而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组&#xff0c…

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统&#xff0c;linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk&#xff0c;我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见&#xff0c;其中最常见的有一行变多行&#xff0c;有下面一份数据&#xff1a; drop table if exists fact_suject_data; create table if not …

基于SSM+JSP的订餐管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…