【数据结构】树和二叉树基本概念和性质

news2024/11/25 7:01:31

目录

  • 前言
  • 1、树的概念
    • 1.1 树的基本概念
    • 1.2 树的主要概念
    • 1.3 树的表示
    • 1.4 树在实际中的运用(表示文件系统的目录树结构)
  • 2. 二叉树概念及结构
    • 2.1 概念
    • 2.2 特殊的二叉树
    • 2.3 二叉树的性质
  • 3. 二叉树性质相关选择题练习
  • 4. 答案和解析
  • 5. 总结


前言

本章带来数据结构重点相关的概念,同时和之前的线性结构完全不同,树是非线性结构



1、树的概念

1.1 树的基本概念

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

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

子树是不相交的,相交如下图,这个结构就不是树了,因为里面有回路,类似与图结构
在这里插入图片描述

1.2 树的主要概念

在这里插入图片描述
关键

  • 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为3
  • 叶节点或终端节点:度为0的节点称为叶节点; 如上图:J、F、K、L、H、I是叶子结点
  • 非终端节点或分支节点:度不为0的节点; 如上图:B、C、D、E…等节点为分支节点
  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B
    的父节点
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
  • 兄弟节点::具有相同父节点的节点互称为兄弟节点; 如上图:B、C、D是兄弟
  • 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为3
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
    另一种情况,根为0层,根的子节点为第1层
  • 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
  • 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先,父亲也是祖先结点
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

其次

  • 森林:由m(m>0)棵互不相交的多颗树的集合称为森林;(数据结构中的学习并查集本质就是一个森林)


1.3 树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,
如:双亲表示法,孩子表示法、孩子兄弟表示法等等。

  • 第一种:孩子兄弟表示法,最常用的的树表示方法

    typedef int DataType;
    struct Node
    {
        struct Node* _firstChild1;    // 第一个孩子结点
        struct Node* _pNextBrother;   // 指向其下一个兄弟结点
        DataType _data;               // 结点中的数据域
    };
    

    在这里插入图片描述

  • 第二种:双亲表示法,把所有的节点都存在数组里,通过子节点存父节点的数组下标来表示,注意不是父节点存下标,就是一个节点只指向父亲,不指向孩子
    在这里插入图片描述

  • 第三种:通过顺序表来存储,但是我们并不知道到底有多少个子节点,这里C++里面库里vector可以解决,vector是可变的不固定数组

1.4 树在实际中的运用(表示文件系统的目录树结构)

在这里插入图片描述

2. 二叉树概念及结构

2.1 概念

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

二叉树的特点:

  1. 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
  2. 二叉树的子树有左右之分,其子树的次序不能颠倒。
    在这里插入图片描述

2.2 特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉
    树。也就是说,如果一个二叉树的层数为K,且结点总数是(2 ^ k) - 1 ,则它就是满二叉树。
  2. 完全二叉树:前k-1层是满的,最后一层不满,但是最后一层从左往右节点都是连续的,节点个数(2 ^ k - 1 - X),X表示最后一层缺的数量

在这里插入图片描述

2.3 二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i - 1) 个结点.
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h - 1
  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2
    +1
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=LogN,以2为底
  5. 度为1的结点一定是左子树;
    度要么为1,要么为0
  6. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从开始编号: 那么就会有:(对于编程的写法,这个规律是成立的)
  • 左孩子结点的下标:2*parent +1;
  • 右孩子结点的下标:2*parent +2;
  • 父亲结点的下标:(child -1) / 2; 其中child为左右孩子都行。

3. 二叉树性质相关选择题练习

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


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



3.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12

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


4. 答案和解析

  1. 通过二叉树性质,度为0的节点比度为2的节点多一个,n0 = n2 + 1,反之n2 = n0 - 1,题中所直接就说明了分支节点的n2的个数,我们一直代入公式即可,199+1 = 200,选B

  1. n0表示叶子结点,在完全二叉树里,n1只可能是0或1我们分别往n1代入0和1
  • 代入0:结果有小数,二叉树节点只能整数,不可能会有小数、分数个节点,所以不成立
  • 代入1:成立,可以化简,最后结果n0 = N,同时也证明该二叉树n1结点个数是1,选A

在这里插入图片描述

  1. 第三题解析如图,选B
    在这里插入图片描述

  2. 这题和第二题解法类似,n0表示叶子结点,在完全二叉树里,n1只可能是0或1我们分别往n1代入0和1
  • 代入0:成立,可以化简,最后结果n0 = 384,同时也证明该二叉树n1结点个数是0,选B
  • 代入1:结果有小数,二叉树节点只能是整数,不可能会有小数、分数个节点,所以不成立

在这里插入图片描述

5. 总结

学好二叉树第一步,就必须对该性质十分熟练和深刻的理解!

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

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

相关文章

Golang | Leetcode Golang题解之第68题文本左右对齐

题目&#xff1a; 题解&#xff1a; // blank 返回长度为 n 的由空格组成的字符串 func blank(n int) string {return strings.Repeat(" ", n) }func fullJustify(words []string, maxWidth int) (ans []string) {right, n : 0, len(words)for {left : right // 当前…

【智能算法应用】麻雀搜索算法求解非线性方程组问题

目录 1.算法原理2.数学模型3.结果展示4.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.数学模型 非线性方程组为&#xff1a; 2 x 1 − x 2 e − x 1 − x 1 2 x 2 e − x 2 (1) \begin{aligned}&2x_1-x_2e^{-x_1}\\&-…

音视频开发3 视频基础,图片基础

图片像素&#xff08;Pixel&#xff09; 一张图片是由多少个 像素 构成的。 例如一张图片是由60x50组成的。 位深度 bit depth RGB表示法 红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff09;、蓝&#xff08;Blue&#xff09; 除了24bit&#xff0c;常见的位深…

深度解析JVM世界:常见的垃圾回收器

本篇文章的主要内容是介绍JVM中常见的垃圾收集器 JVM&#xff08;Java Virtual Machine&#xff09;垃圾收集器是Java虚拟机中负责自动管理内存的重要组件。它的主要任务是自动回收不再使用的对象&#xff0c;以防止内存泄漏&#xff0c;并使得程序员无需关心内存管理问题&…

快乐数(双指针)

算法原理 通过题目的第二条我们可以知道&#xff1a;这道题只有两种结果&#xff1a; &#xff08;1&#xff09;一直循环并且变不成1&#xff1b; &#xff08;2&#xff09;能变成1 以上的两种情况其实我们可以归结成一种情况&#xff1a;都是无限循环但是第二种是对于1的…

Unreal游戏GPU性能优化检测模式全新上线

UWA已经在去年推出了针对于Unity项目的GPU性能优化工具&#xff0c;通过对GPU渲染性能、带宽性能以及各种下探指标&#xff0c;帮助Unity项目研发团队定位由GPU导致的发热耗电问题。这个需求在Unreal团队中也极为强烈&#xff0c;因此UWA将该功能移植到针对Unreal项目的GOT Onl…

深度学习之基于Vgg16卷积神经网络心电图心脏病诊断系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 心脏病作为全球范围内的一种常见且严重的疾病&#xff0c;其早期的准确诊断对于患者的治疗和康复至关…

深度学习之基于YOLOv8学生课堂行为检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 随着教育信息化的不断推进&#xff0c;对学生课堂行为的实时监测与评估成为了教育领域的研究热…

图像处理技术与应用(四)

图像处理技术与应用入门 颜色空间及其转换 颜色空间是一种用于在数字图像中表达和指定颜色的方法。不同的颜色空间使用不同的方式来定义颜色&#xff0c;每种方式都有其特定的用途和优势。以下是一些常见的颜色空间及其特点&#xff1a; RGB&#xff08;红绿蓝&#xff09;&a…

【七十九】【算法分析与设计】并查集模板!!!并查集的实现_牛客题霸_牛客网,【模板】并查集 - 洛谷,并查集代码!!!

并查集的实现_牛客题霸_牛客网 描述 给定一个没有重复值的整形数组arr&#xff0c;初始时认为arr中每一个数各自都是一个单独的集合。请设计一种叫UnionFind的结构&#xff0c;并提供以下两个操作。 boolean isSameSet(int a, int b): 查询a和b这两个数是否属于一个集合 void u…

SparkSQL编程入口和模型与SparkSQL基本编程

SparkSQL编程入口和模型 SparkSQL编程模型 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 1)SQL&#xff1a;SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的是&#xff0c;SQL操作的是表&#xf…

90、动态规划-最长的有效括号

思路&#xff1a; 找出有效括号并且是最长的有效括号 dp[i]表示以i结尾的括号最长是多少 然后从1开始 因为从0位置不管是左括号还是右括号都是无法形成一个完成的括号。所以dp[0]0&#xff1b; 当i1时候&#xff0c;判断括号是否是&#xff09;如果不是那么无法结尾&#x…

3. FactoryTalk View SE按钮工具库

系统自带的按钮比较丑陋&#xff0c;为了迎合客户需求可以从工具库中选择漂亮的按钮图形。 单击按钮选择释放外观–使用图像引用–启动库–选择按钮库&#xff0c;找到一款合适的图形–右键copy copy之后点击从库中粘贴–确定 这样就实现按下按钮的颜色是红色&#xff0c;在…

记录一次给PCAN升级固件pcan_canable_hw-449dc73.bin

方法一:网页升级 首先将3.3V与BOOT短接,插入电脑USB接口,识别为STM32 BOOTLOADER,芯片进入DFU模式。 如果电脑没有识别到STM32 BOOTLOADER,或无法驱动,则需要安装ImpulseRC_Driver_Fixer修复工具。 推荐使用Google浏览器打开网页升级选择PCAN固件,点Connect and Update,…

【Stream 流】通过一个例子看遍所有Stream API使用场景

前言 上篇文章记录了方法引用&#xff0c;Lambda表达式等基础的知识点&#xff0c;这篇文章主要结合课设项目详细介绍Stream 流的API以及它的主要场景。 Stream API作用 在Java 8及其以后的版本中&#xff0c;Stream API为处理集合数据提供了强大而灵活的功能。有了Stream AP…

Java双亲委派机制

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 概述 Java程序在运…

JAVA聊天室-网络编程socket+javafx+maven【附带exe+源代码,小白可运行,简单容易上手,代码附带注释】

前言 可以学习到java网络编程的知识&#xff0c;也可以拿去当个模板去添加功能 项目展示&#xff1a; chatv1.0 服务器打包视频&#xff1a; 服务器打包exe 1. 项目概述 本项目旨在开发一个简单的群聊室应用程序&#xff0c;使用JavaFX作为用户界面框架&#xff0c;以及Java…

管道通信与Linux命令的执行-(读书笔记-十三)

|前一个命令的输出作为后一个命令的输入。 在Linux中&#xff0c;|符号是一个管道符号&#xff0c;用于将前一个命令的输出作为后一个命令的输入。这种机制允许你将多个命令组合在一起&#xff0c;以执行复杂的操作。下面是一些基本的例子&#xff1a; 查看当前目录下的文件列…

Axure实现菜单抽屉效果

Axure是怎么实现如下效果的&#xff1f; 菜单打开和收起侧边栏菜单抽屉效果 实现效果 两级菜单&#xff0c;点击菜单收起其他菜单&#xff0c;打开当前菜单。 实现原理 单击一级菜单时&#xff0c;1&#xff09;切换当下二季菜单的显示/隐藏状态 2&#xff09;隐藏其他菜单…

[Android]四大组件简介

在 Android 开发中&#xff0c;“四大组件”&#xff08;Four Major Components&#xff09;是指构成 Android 应用程序的四种核心组件&#xff0c;它们通过各自的方式与系统交互&#xff0c;实现应用的多样功能。这些组件是&#xff1a;Activity、Service、Broadcast Receiver…