树和二叉树 --- 数据结构

news2024/9/29 9:29:49

目录

1.树的概念及结构

1.1树的概念

1.2树的表示

1.3树在实际生活中的运用

2.二叉树的概念及结构 

2.1概念

2.2特殊的二叉树

2.3二叉树的性质

2.4二叉树的存储结构


1.树的概念及结构

1.1树的概念

树是一种非线性的数据结构,它是由n (n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的

  • 有一个特殊的结点,称为根结点,根节点没有前驱结点
  • 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、.......Tm,其中每一个集合Ti(1 <= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
  • 因此,树是递归定义的。

树型结构:注意:树形结构中,子树之间不能有交集,否则就不是树形结构

 

树的相关概念:

 

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

叶结点或终端结点:度为0的结点称为叶结点;如上图:B、C、H、I...等结点为叶结点

非终端结点或分支结点:度不为0的结点;如上图:D、E、F、G...等结点为分支结点

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

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

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

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

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

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

堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、l互为兄弟结点

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

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

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

1.2树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既要保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法孩子表示法孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解一下,其中最常用的是孩子兄弟表示法

1.双亲表示法

struct TreeNode
{
    int data;
    int parent;    //双亲的下标
}

2.孩子表示法

如果明确了树的度可以定义:

struct TreeNode
{
    int data;
    struct TreeNode* child1;
    struct TreeNode* child2;
    // . . .
    //树的度是几就定于几个孩子
}

不知道树的度可以采用线性表存储孩子,通常采用的是“顺序表+链表”的组合结构

typedef struct CTNode{
    //链表中每个结点存储的不是数据本身,
    //而是数据在数组中存储的位置下标!!
    int child;
    struct CTNode * next;
}ChildPtr;

typedef struct TreeNode
    //结点的数据类型
    TElemType data;
    //孩子链表的头指针
    ChildPtr* firstchild;
}TreeNode;

3.孩子双亲表示法相当于链表中的循环链表,这里就不做介绍了

4.孩子兄弟表示法

typedef int DataType
struct Node
{
    struct Node* fristChild;    //指向该节点的第一个孩子节点
    struct Node* NextBrother;   //指向该节点的下一个兄弟节点
    DataType data;    //该节点中的数据
}

 

1.3树在实际生活中的运用

Windows操作系统文件系统,文件树,C盘D盘两个文件树,可以认为是森林。

Linux操作系统树状目录结构

2.二叉树的概念及结构 

2.1概念

—棵二叉树是结点的一个有限集合,该集合:

  1. 或者为空
  2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

 从上图可以看出:

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

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

现实中的二叉树:

2.2特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^K-1,则它就是满二叉树。
  2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n相同的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。完全二叉树节点个数取值范围是【2^(K-1),2^K-1】。

 

 

2.3二叉树的性质

1.若规定根节点1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点

⒉.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1.

3.对任何一棵二叉树,如果度为0的叶结点个数为N0,度为2的分支结点个数为N2,则有N0 = N2+1

二叉树总节点数目为N,有 N=N0+N1+N2,二叉树度数总和为0*N0+1*N1+2*N2 = N-1

N0+N1+N2-1 =  0*N0+1*N1+2*N2

N0 = N2+1;

4.若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2(n + 1)。(ps: log2(n +1)是log以2为底,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无右孩子

*6.给定N个节点,能构成h(N)种不同的二叉树。h(N)为卡特兰数的第N项。h(n)=C(n,2*n)/(n+1)。

*7.设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i

带*太难,一般不用。

例题:

1.某二叉树共有399个结点,其中有199个度为2的结点,则该二叉树中的叶子结点数为()

A 不存在这样的二叉树
B 200
C 198

D 199

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

A 非完全二叉树
B 堆
C 队列

D 栈

3.在具有2n个结点的完全二叉树中,叶子结点个数为()
A n
B n+1

C n-1

D n/2

4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为()

A 11
B 10

C 8

D12

5.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384

C 385

D 386


答案:1.B 2.A 3.A 4.B 5.B

第3题解析:

因为N0 = N2 + 1

N0+N1+N2 = 2n

N0+N1+N0-1 = 2n

2N0 +N1-1 = 2n  2n为偶数,完全二叉树度为1的结点个数要么是1个,要么没有。所以只能是1

2N0 = 2n      N0 = n  同理得出N1= 1  N2 = n-1

2.4二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
1.顺序存储
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的文章会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

2.链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程学到高阶数据结构如红黑树等会用到三叉链。

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/804393.html

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

相关文章

路由策略(重发布)

要求&#xff1a; 1、使用双点双向重发布 2、所有路由器进行最佳选路 3、存在备份路径&#xff0c;不得出现环路&#xff0c;和路由回馈 1.更改设备名称配置接口IP地址 R1 <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEt…

Elasticsearch 整合springboot-Elasticsearch文章二

文章目录 官网版本组件版本说明实现代码地址pom.xmlapplication.ymlRepositoryVisitLog模型定义controller使用测试http请求结果kibana结果ID外传 官网 https://www.elastic.co/cn/ 版本 https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/ 我们…

[SSM]GoF之代理模式

目录 十四、GoF之代理模式 14.1对代理模式的理解 14.2静态代理 14.3动态代理 14.3.1JDK动态代理 14.3.2CGLIB动态代理 十四、GoF之代理模式 14.1对代理模式的理解 场景&#xff1a;拍电影的时候&#xff0c;替身演员去代理演员完成表演。这就是一个代理模式。 演员为什…

爬虫005_python类型转换_其他类型转换为整型_转换为Float类型_转换为字符串_转换为布尔值---python工作笔记023

首先来看,字符串转换成int 很简单 float转换成int 会把小数点后面的内容丢掉 boolean转换为int true是1 false 是0 然后字符串转换为int,要注意 不能有特殊字符比如1.23 中有点 就报错 上面字符串12ab,有ab也报错 看上面

向量与流迭代器(istream_iterator和ostream_iterator)

运行代码&#xff1a; //向量与流迭代器 #include"std_lib_facilities.h"struct Item {string name;int iid;double value;friend istream& operator>>(istream& is, Item& ii);friend ostream& operator<<(ostream& os, const Ite…

F5 LTM 知识点和实验 4-持久化

第四章:持久化 持久化: 大多数应用都是有状态的,比如,使用一个购物网站,最重要的是用户在放入一个商品之后,刷新网页要能继续看到购物车里的东西,这就需要请求报文发到同一个后端服务器上,持久化就能完成这个功能。 持久化支持一下几种场景: 源地址目标地址SSLSIPH…

【go-zero】浅析 01

“github.com/google/uuid” uuid.New().String() go-zero 文档 https://www.w3cschool.cn/gozero/ go-zero 官网 https://go-zero.dev/ 快速开始&#xff1a; $ mkdir go-zero-demo $ cd go-zero-demo $ go mod init go-zero-demo $ goctl api new greet $ go mod tidy Done…

揭开神秘的面纱--自己实现MyBatis 底层机制[下]

&#x1f600;前言 本篇博文是MyBatis 底层机制的核心实现&#xff0c;简单的手法让MyBatis 不再神秘&#xff0c;希望能够帮助到你&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的…

JAVA-字符串生成图片

直接上代码 public static void main(String[] args) throws IOException {createFontImage("红色", new Font("宋体", Font.BOLD, 50), 400, 400);}/*** 根据str,font的样式将文字变成图片,然后返回一个流** param str 字符串* param font 字体* pa…

奇富科技引领编制国内首个金融行业大模型标准

7月28日&#xff0c;由中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;组织的“行业大模型高质量发展论坛暨可信AI大模型标准宣贯会”在江苏南京召开。会议发起了行业大模型标准联合推进计划&#xff0c;启动了多个行业的大模型标准编制工作&#xff0c;其中&am…

ES6 - promise.all和race方法的用法详解

文章目录 一、前言二、Promise.all()1&#xff0c;第一句&#xff1a;Promise.all()方法接受一个数组作为参数&#xff0c;且每一个都是 Promise 实例2&#xff0c;第二句&#xff1a;如果不是&#xff0c;就会先调Promise.resolve方法&#xff0c;将参数转为 Promise 实例再进…

Python web实战 | Docker+Nginx部署python Django Web项目详细步骤【干货】

概要 在这篇文章中&#xff0c;我将介绍如何使用 Docker 和 Nginx 部署 Django Web 项目。一步步讲解如何构建 Docker 镜像、如何编写 Docker Compose 文件和如何配置 Nginx。 1. Docker 构建 Django Web 项目 1.1 配置 Django 项目 在开始之前&#xff0c;我们需要有一个 D…

自定义代理

以下代码&#xff1a;可以在view 和model文章中进行添加 m_model new QStandardItemModel(2, FixedColumnCount, this);m_selection new QItemSelectionModel(m_model, this);ui->tableView->setModel(m_model); //设置模型ui->tableView->setSelectionModel(m_s…

第一堂棒球课:MLB棒球大联盟的主要战术·棒球1号位

MLB棒球大联盟的主要战术 攻击战术run-and-foul&#xff08;跑垒战术&#xff09;&#xff1a;以速度为优势&#xff0c;在适当的时机发动进攻&#xff0c;争取在一回合内完成得分。 grounder&#xff08;阻截战术&#xff09;&#xff1a;队员在垒包之间阻止对手的跑垒和传球。…

eclipse 最新版没有navigator视图如何解决

使用project exploere视图可以显示类似navigator视图 1.显示project exploere视图 window---->show view --->project exploere 2.project exploere视图转换为类似navigator视图 第一步&#xff1a;点击视图右上角三个点或者倒三角&#xff0c;点击fiters and custom…

【java入门学习】

文章目录 java学习章节目录学习前的准备main函数怎么写&#xff1f;Java程序运行的步骤如何让代码运行起来&#xff1f;java程序由三部分构成&#xff1a;注释注释规范 标识符练习 总结 java学习章节目录 SE语法 初阶段主要来熟悉java的语法&#xff1a; 1.初始java 2.数据类型…

真正实现无人化自主管理的清洁机器人来了!涂鸦智能新方案为你解密

如果你观察家庭清洁电器的发展历程&#xff0c;可以发现这就是一部人类“偷懒”史&#xff0c;而有技术含量的“懒”&#xff0c;真的可以改变世界&#xff01; 一、懒是产品创新的重要灵感来源 从洗衣机替代手洗&#xff0c;到扫地机器人帮助人们从繁琐的地面清洁中解脱&…

RL 实践(6)—— CartPole【REINFORCE with baseline A2C】

本文介绍 REINFORCE with baseline 和 A2C 这两个带 baseline 的策略梯度方法&#xff0c;并在 CartPole-V0 上验证它们和无 baseline 的原始方法 REINFORCE & Actor-Critic 的优势参考&#xff1a;《动手学强化学习》完整代码下载&#xff1a;7_[Gym] CartPole-V0 (REINFO…

复现YOLOv8改进最新MPDIoU:有效和准确的边界盒回归的损失,打败G/E/CIoU,效果明显!!!

MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression 论文简介MPDIoU核心设计思路论文方法实验部分加入YOLOv5代码论文地址:https://arxiv.org/pdf/2307.07662.pdf 论文简介 边界盒回归(Bounding box regression, BBR)广泛应用于目标检测和实例分割,是目标…

详细介绍如何使用HuggingFace和PyTorch进行医学图像分割-附源码

医学图像分割是一种创新过程,使外科医生能够拥有虚拟的“X 射线视觉”。它是医疗保健领域非常有价值的工具,可提供非侵入性诊断和深入分析。考虑到这一点,在这篇文章中,我们将探索威斯康辛大学麦迪逊分校胃肠道图像分割Kaggle 挑战数据集。作为该项目的一部分,我们将使用 …