树(一)树和二叉树的基本概念

news2024/10/12 10:17:33

在这里插入图片描述

文章目录

  • 一、树
    • 1、什么是树
    • 2、树的相关概念
    • 3、树的表示
  • 二、二叉树
    • 1、二叉树的概念
    • 2、二叉树的几种情况
    • 3、特殊二叉树
    • 4、二叉树的性质
    • 5、二叉树的存储结构

一、树

1、什么是树

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。
在这里插入图片描述

  • 子树是不相交的
  • 除根节点外,每个节点有且仅有一个父节点
  • 一颗N个结点的树有N-1条边

2、树的相关概念

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的度为3

叶节点或终端节点:度为0的节点称为叶节点; 如上图:J、F、K、L、H、I等节点为叶节点

非终端节点或分支节点:度不为0的节点; 如上图:B、C、D、E、G等节点为分支节点

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点

兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为3

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:F、G互为兄弟节点

节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

森林:由m(m>0)棵互不相交的树的集合称为森林

3、树的表示

树结构相对线性表比较复杂,存储时既要保存值域,也要保存结点和结点之间的关系,树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。其中最常用的就是孩子兄弟表示法。

//孩子兄弟表示法
typedef int DataType;
struct Node
{
    struct Node* firstChild; // 第一个孩子结点
	struct Node* nextBrother; // 指向其下一个兄弟结点
	DataType data; // 结点中的数据域
};

在这里插入图片描述

在这里插入图片描述

二、二叉树

1、二叉树的概念

一棵二叉树是结点的一个有限集合,该集合要么为空,要么由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

在这里插入图片描述

  • 二叉树不存在度大于2的结点
  • 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2、二叉树的几种情况

任意二叉树都是由以下几种情况复合而成

空树:
在这里插入图片描述
只有根结点:
在这里插入图片描述
只有左子树:
在这里插入图片描述
只有右子树:
在这里插入图片描述
左右子树都有:
在这里插入图片描述

3、特殊二叉树

满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。

完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
满二叉树是一种特殊的完全二叉树

在这里插入图片描述
在这里插入图片描述

4、二叉树的性质

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

5、二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。

顺序存储:

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

在这里插入图片描述
在这里插入图片描述
链式存储:

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。
通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。
链式结构又分为二叉链和三叉链。

在这里插入图片描述
在这里插入图片描述

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
	struct BinTreeNode* pLeft; // 指向当前节点左孩子
	struct BinTreeNode* pRight; // 指向当前节点右孩子
	BTDataType data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
	struct BinTreeNode* pParent; // 指向当前节点的双亲
	struct BinTreeNode* pLeft; // 指向当前节点左孩子
	struct BinTreeNode* pRight; // 指向当前节点右孩子
	BTDataType data; // 当前节点值域
}

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

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

相关文章

C++学习——vector类的使用

目录 vector类的介绍&#xff1a; vector类的构造函数: operator operator [ ] begin & end size & resize capacity & reserve push_back & pop_back insert & erase vector类的介绍&#xff1a; vector是C标准模板库中的部分内容&#xff0c;中文偶尔…

【Python】OpenCV立体相机配准与三角化代码实现

下面的介绍了使用python和OpenCV对两个相机进行标定、配准,同时实现人体关键点三角化的过程 import cv2 as cv import glob import numpy as np import matplotlib.pyplot as pltdef calibrate_camera(images_folder):images_names = glob.glob(images_folder

css画一条渐变的虚线

效果展示 原理&#xff1a;给元素设置一个渐变的背景色&#xff0c;画一条白色的虚线盖住背景&#xff0c;就达到了渐变虚线的效果 代码&#xff1a; <div class"pending-line"></div>.pending-line{width: 101px;border-top: 2px dashed #fff; // do…

C++算法 —— 动态规划(3)多状态

文章目录 1、动规思路简介2、按摩师3、打家劫舍Ⅱ4、删除并获得点数5、粉刷房子6、买卖股票的最佳时机含冷冻期7、买卖股票的最佳时机含手续费8、买卖股票的最佳时机Ⅲ9、买卖股票的最佳时间Ⅳ 每一种算法都最好看完第一篇再去找要看的博客&#xff0c;因为这样会帮你梳理好思路…

正式支持 NVIDIA A100,吞吐量提高 10 倍的Milvus Cloud2.3 使用指南

Milvus 2.3 正式支持 NVIDIA A100! 作为为数不多的支持 GPU 的向量数据库产品,Milvus 2.3 在吞吐量和低延迟方面都带来了显著的变化,尤其是与此前的 CPU 版本相比,不仅吞吐量提高了 10 倍,还能将延迟控制在极低的水准。 不过,正如我前面提到的,鲜有向量数据库支持 GPU,…

必须收藏 | 如何完全卸载ArcGIS

好多小伙伴在卸载ArcGIS过程都遇到了卸载不彻底无法重新安装新版本&#xff0c;卸载残留的注册表找不到等一系列问题&#xff0c;今天小编为大家整理了几个如何完全卸载ArcGIS的方法&#xff0c;希望能够帮到大家&#xff01; #1快捷版 1、开始>控制面板>添加删除程序&…

MR源码解析和join案例

MR源码解析 new Job(): 读取本地文件, xml配置job.start(): 启动线程job的run():线程方法 runTasks(): 传入对应的接口&#xff0c;启动map或者reduceMapTask类的run(): 设置map阶段的参数&#xff0c;初始化任务&#xff0c;创建上下文对象 创建读取器LineRecordReader判断是…

【计算机网络】HTTPS

文章目录 1. HTTPS的概念2. 加密常见的加密方式对称加密非对称加密 3. HTTPS的工作过程的探究方案1 —— 只使用对称加密方案2 —— 只使用 非对称加密方案3 —— 双方都是用非对称加密方案4 —— 非对称加密对称加密中间人攻击引入证书CA认证理解数据签名 方案5 —— 非对称加…

【Redis】1、NoSQL之Redis的配置及优化

关系数据库与非关系数据库 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&a…

WebGL 绘制矩形

上一节绘制了圆点&#xff0c;调用的绘制方法如下&#xff1a;gl.drawArrays(gl.POINTS, 0, 1); 第一个参数明显是个枚举类型&#xff0c;肯定还有其他值&#xff0c;如下所示&#xff1a; POINTS 可视的点LINES 单独线段LINE_STRIP 线条LINE_LOOP 闭合线条TRIANGLES 单独三…

【Redis7】--1.概述、安装和配置

文章目录 1.Redis概述1.1Redis是什么1.2Redis与MySQL的关系1.3Redis功能1.4Redis优势 2.Redis的安装和配置 1.Redis概述 1.1Redis是什么 Redis全称 远程字典服务器&#xff08;Remote Dictionary Server&#xff09;&#xff0c;它是完全开源的&#xff0c;使用ANSIC语言编写…

算法-26. 删除有序数组中的重复项-⭐

给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你需要做…

【数据分析】Python:处理缺失值的常见方法

在数据分析和机器学习中&#xff0c;缺失值是一种常见的现象。在实际数据集中&#xff0c;某些变量的某些条目可能没有可用的值。处理缺失值是一个重要的数据预处理步骤。在本文中&#xff0c;我们将介绍如何在 Pandas 中处理缺失值。 我们将探讨以下内容&#xff1a; 什么是缺…

php将数组中的最后一个元素放到第一个

array_unshift($firstStepResult, array_pop($firstStepResult)); 转换之后

spring spring-boot spring-cloud spring-cloud-alibaba之间版本对应关系

spring 版本与 jdk 的对应关系 https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions 从 spring 6.0 开始使用 jdk 17 进行编译 对应的相关 servlet 容器&#xff08;tomcat、undertow、jetty等&#xff09;的 servlet 规范转移到 eclipse&…

算法-27.移除元素-⭐

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

MiniDump

一、minidump 模块集成 // .pro QT - guiCONFIG c11 console CONFIG - app_bundle# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consul…

想兼职?学网络安全,钱赚到你手软

前言 疫情过后&#xff0c;现在的经济形式并不好&#xff0c;所以有很多人想在本职工作以外找一份兼职&#xff0c;亦或者担心自己被裁员&#xff0c;想先学一门技术&#xff0c;从而提高自己的抗风险能力&#xff0c;这没有比网络安全更适合的了。如果有基础的小伙伴完全可以…

01深度学习目标检测引入

目标检测是计算机视觉领域的一个重要任务&#xff0c;旨在从图像或视频中准确地检测和定位特定的目标物体。 一、目标检测问题定义 目标检测是在图片中对可变数量的目标进行查找和分类。 二、目标检测过程中的常见的问题 目标种类和数量问题目标尺度问题外在环境干扰问题 三…

IDEA显示val,var的推断类型的设置

在java中val,var可以减少繁琐的代码量&#xff0c;但是IDEA默认关掉自动类型&#xff0c;导致使用val&#xff0c;var表示的不能一言判别类型&#xff0c;并且不能显示点入查看类型的详情因此需要在idea中设置&#xff0c;能够自动显示推断类型。 步骤1 Setting--->editor…