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

【数据结构】二叉树的概述

文章目录

5. 树与二叉树

5.1 数的基本概念

5.1.1 树的定义

5.1.2 树的常用术语

5.2 二叉树的概述

5.2.1 基本概念

5.2.2 满二叉树定义

5.2.3 完全二叉树定义

5.2.4 单分支树的定义

5.2.5 二叉树的特性

5.2.6 存储结构

5. 树与二叉树

  • 树形结构是一种非常重要的==非线性结构==,树形结构中数据元素之间具有==一对多==的逻辑关系。

5.1 数的基本概念

5.1.1 树的定义

  • 树是由n(n>=0)个结点所构成的有限集合

    • 当n=0时,称为空树

    • 当n>0时,n个结点满足以下条件

      • 有且仅有一个称为根的结点

      • 其余结点可分为m个互不相交的有限集合,且每一个集合又构成一棵树,该树称为根节点的子树。

  • 对于一颗非空树,其中有且仅有一个没有前驱的结点,这个结点就是==根节点==,其余结点有且仅有一个前驱,但可以有多个后继。

 

A

A

B

C

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

  • 树的表示法:树形表示法、文氏图表示法、凹入图表示法和广义表(括号)表示法

    • 树形表示法

    • 文氏图表示法

    • 凹入图表示法

    • 广义表(括号)表示法

       

5.1.2 树的常用术语

术语描述
树的结点由一个数据元素及关联其子树的边所组成。
结点的边实体与实体之间的逻辑关系
结点的==路径==从根结点到该结点所经历的结点和分支的顺序排列。 结点J的路径:A-->C-->G-->J
路径的长度结点路径中所包含的分支数。例如:结点J的路径长度为3.
结点的==度==该结点所拥有的子树的数目。例如:结点A的度为3,结点B的度为1
树的==度==树中所有结点度的最大值。
叶结点树中度为0的结点,也称为终端结点。
分支结点树中度不为0的结点,也称为非终端结点。除叶子结点之外的所有结点都是分支结点。
孩子结点结点的子树的根节点,也称为子节点。结点A的孩子结点是BCD
双亲结点某结点有孩子结点,则该结点称为孩子的双亲结点,也称为父节点。
子孙结点该结点所有子树中的任意结点。
祖先结点该结点的路径中除此结点之外的所有结点。
兄弟结点具有同一个双亲的结点。
结点的==层次==规定树中根节点的层次为0,其他结点的层次是双亲结点的层次数加1,结点P层次数为4
树的==深度==树中所有结点的层次数的最大值加1。(a) 深度为1 (b)深度为3 (c)深度为5
有序树各节点的所有子树之间从左到右有严格的次序关系,不能交换。
无序树树中各节点的所有子树之间没有严格的次序关系。从左到右没有次序之分。
森林由m(m>=0)棵互不相交的树所构成的集合

5.2 二叉树的概述

5.2.1 基本概念

  • 二叉树是一个特殊的树,每个结点最多只有两棵子树,且两棵子树也是二叉树。

  • 精确定义:二叉树是由n(n>=0)个结点所构成的有限集合。当n=0时,这个集合为空,此时二叉树为空树,当n>0时,这个集合是由一个根结点和两个互不相交的分别称为左子树和右子树的二叉树构成。

  • 二叉树的两棵子树有左右之分,所以二叉树是有序树

 

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

 

  • 二叉树的5种基本形态:空树、只有根结点、只有左子树、只有右子树、既有左子树又有右子树

 

/

X

X

X

/

X

/

X

X

X

X

5.2.2 满二叉树定义

  • 满二叉树是二叉树的一种特殊情况。

  • 如果在一棵二叉树中,它的所有结点或者叶结点,或者是左、右子树都非空,并且所有叶结点都在同一层上,则称这棵二叉树为满二叉树。

 

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

5.2.3 完全二叉树定义

  • 如果在一棵具有n个结点的二叉树中,它的逻辑结构与满二叉树的前n个结点的逻辑结构相同,则称这样的二叉树为完全二叉树。

 

A

B

C

D

E

F

G

H

I

J

K

5.2.4 单分支树的定义

  • 左支树:所有结点都没有右孩子的二叉树。

     

  • 右支树:所有结点都没有左孩子的二叉树。

     

5.2.5 二叉树的特性

1)特性1:i层最多结点数 2^i

  • 二叉树中第i(i>=0)层上的结点数最多为2^i

$$
\begin{array}{c|cc} \hline i层&0&1&2&3&4&5&\cdots&i\\ \hline 最多结点数&2^0&2^1&2^2&2^3&2^4&2^5&\cdots&2^i\\ \hline 最多结点数&1&2&4&8&16&32&\cdots&2^i\\ \hline \end{array} \tag{i层最多结点数}
$$

2)特性2:最多结点个数 2^h-1

  • 深度为h(h>=1)的二叉树中最多有2^h-1个结点

$$
S_n=a_1 + a_2 + a_3 + \cdots + a_{n-1} + a_n \\ S_n=a_1 + a_1q + a_1q^2 + \cdots + a_1q^{n-2} + a_1q^{n-1} \\ qS_n=a_1q + a_1q^2 + a_1q^3 + \cdots + a_1q^{n-1} + a_1q^n \\ S_n-qS_n=a_1-a_1q^{n} \\ S_n=\dfrac{a_1-a_1q^n}{1-q} \\ S_n=\dfrac{a_1(1-q^n)}{1-q} \tag{等比数列求和}
$$

$$
S_n=\dfrac{a_1(1-q^n)}{1-q} = 2^n-1 & (a_1=1, q=2) \\ S_n= 2^h-1 & (h \ge 1 , 最多) \\ S_n= 2^{h-1} & (h \ge 1 , 最少) \\ \tag{二叉树求和}
$$

3)特性3:叶子结点关系 n_0 = n_2 + 1

  • 对于任意一颗二叉树,若其叶结点的个数为n_0,度为2的结点个数为n_2,则有n_0=n_2+1

    $$
    n_0 = n_2 + 1 & (n_0叶子节点个数,n_2度为2的结点个数) \\ \tag {}
    $$

  • 验证1:

 

  • 验证2:

     

  • 证明

$$
& n_1 度为1的结点个数 ,n 总结点个数,e分支的个数 \\ n = n_0 + n_1 + n_2 & 总数 = 叶结点 + 度为1结点 + 度为2结点 \\ e = n_1 + 2 × n_2 & 度为1结点有1个分支,度为2的结点有2个分支 \\ n = e + 1 & 除了根结点,其他每个结点均对应一个进入它的分值 \\ n_0 = n_2 + 1
$$

4)特性4:深度 ⌊log2n⌋ + 1

  • 具有n个结点的完全二叉树的深度为⌊log2n⌋ + 1 或 ⌊log2(n+1)⌋

    $$
    h = ⌊log_2n⌋ + 1 \tag{}
    $$

$$
\begin{array}{c|c|c} \hline 数的深度 &取值&公式&log_2n的值 & ⌊log2n⌋的值\\ \hline 3& 4 \le n \lt 8& 2^2 \le n \lt 2^3 & 2 \le log_2n \lt 3 & 2 \\ \hline 4& 8 \le n \lt 16& 2^3 \le n \lt 2^4 & 3 \le log_2n \lt 4 & 3 \\ \hline 5& 16 \le n \lt 32& 2^4 \le n \lt 2^5 & 4 \le log_2n \lt 5 & 4 \\ \hline 6& 32 \le n \lt 64& 2^5 \le n \lt 2^6 & 5 \le log_2n \lt 6 & 5 \\ \hline h& & 2^{h-1} \le n \lt 2^h & h-1 \le log_2n \lt h & h-1 \\ \hline \end{array} \tag{}
$$

  • 数学常识

    向下取整的运算称为Floor,用数学符号⌊ ⌋表示;向上取整的运算称为Ceiling,用数学符号⌈ ⌉表示

    例如: ⌊59/60⌋=0 ⌈59/60⌉=1 ⌊-59/60⌋=-1 ⌈-59/60⌉=0

 

5)特性5:判断是否

  • 若对含n个结点的完全二叉树从上到下且从左至右进行0至n-1的编号,则对完全二叉树中任意一个编号为1的结点有:

    1. 若i=0,则该结点是二叉树的根,无双亲,否则编号为(i-1)/2的结点为其双亲结点。

    2. 若2i+1>=n,则该结点无左孩子,否则,编号为2i+1的结点为其左孩子结点

    3. 如果2i+2>=n,则该结点无右孩子结点,否则,编号为2i+2的结点为其右孩子结点。

 

0

1

2

3

4

5

6

7

8

9

10

$$
\begin{array}{c|c|c} \hline 序号i& 结论5.1双亲节点 \frac{i-1}{2} & 个数n & 2i+1 & 结论5.2左孩子 & 2i+2 & 结论5.3:右孩子 \\ \hline 5 & \frac{5-1}{2}=2 & 7 & 11 & 无 & 12 & 无\\ \hline 3 & \frac{3-1}{2}=1 & 8 & 7 & 2×3+1 =7 & 8 & 无\\ \hline 4 & \frac{4-1}{2}=1 & 11 & 9 & 2×4+1=9 & 10 & 2×4+2=10\\ \hline \end{array} \tag{}
$$

5.2.6 存储结构

1)顺序存储结构

  • 完全二叉树存储:

    用一组地址连续的存储单元从根结点开始依次自上而下,并按层次从左到右存储完全二叉树上的各节点元素,即将完全二叉树编号为i的结点元素存储在下标为i数组元素中。

     

  • 非完全二叉树:

    先在树中增加一些并不存在的虚结点并使其成为一棵完全二叉树,然后用与完全二叉树相同的方法对结点进行编号,再将编号为i的结点的值存放到数组下标为i的数组单元中,虚结点不存放任何值。

     

  • 顺序存储适用于满二叉树和完全二叉树。

  • 对于非完全二叉树来说,一个深度为h的树,需要的存储单元为2^h-1,会造成空间的浪费,如:对于右支树来说,只需要h个存储单元,但是存储的时候却要使用2^h-1个空间。

2)链式存储结构

  • 二叉树的链式存储:将二叉树的各个结点随机的存放在位置任意的内存空间中,各个结点之间的逻辑关系通过指针来反映。

  • 链式存储有2种方式:二叉链表存储结构、三叉链表存储结构

    • 二叉链表存储结构有3个域:数据域data、左孩子域lchild、右孩子域rchild

       

    • 三叉链表存储结构有4个域:数据域data、左孩子域lchild、右孩子域rchild、父节点域parent

       

  • 二叉链表存储结构示意图

     

  • 三叉链表存储结构示意图

     

  • 二叉链式存储结构是二叉树最常用的存储结构。

    • 结点类

      public class BiTreeNode {
          public Object data;                 //数据域
          public BiTreeNode lchild, rchild;   //左、右孩子域
      }

    • 二叉树类

      public class BiTree {
          private BiTreeNode root;    
          //树的根节点
          public BiTree() {                   //构建一颗空树
              this.root = null;
          }
          public BiTree(BiTreeNode root) {    //构建一棵树
              this.root = root;
          }
      }

      root.lchild = new BiTreeNode("B");

      root.rchild = new BiTreeNode("C");

        

相关文章:

  • 【iMessage软件苹果相册推】对付nvm应当可以使用brew直接安装brew install flow 到这里根本的环境
  • 【SQL刷题】DAY16----SQL高级联结专项练习
  • 腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)
  • 解决Mybatis-Plus或PageHelper多表分页查询总条数不对问题
  • AMQP协议详解
  • JDBC的基础操作
  • centos7安装MySQL5.7
  • 关于竞赛,CSDN还有很长的路要走
  • 猿创征文| Unity高级开发面向对象编程知识总结
  • IDEA 连接 数据库
  • 【Linux】- 权限管理
  • 面试官:谈谈你对IOC和AOP的理解及AOP四种实现方式
  • 查询优化_排序、分组优化
  • CentOS 7 安装mariadb
  • visual studio 2019创建dll项目备忘
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • Angular6错误 Service: No provider for Renderer2
  • Cumulo 的 ClojureScript 模块已经成型
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Fundebug计费标准解释:事件数是如何定义的?
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Next.js之基础概念(二)
  • Python学习笔记 字符串拼接
  • SOFAMosn配置模型
  • Spring框架之我见(三)——IOC、AOP
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 关于使用markdown的方法(引自CSDN教程)
  • 区块链技术特点之去中心化特性
  • 深入 Nginx 之配置篇
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 一些关于Rust在2019年的思考
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​决定德拉瓦州地区版图的关键历史事件
  • #include到底该写在哪
  • #laravel 通过手动安装依赖PHPExcel#
  • $$$$GB2312-80区位编码表$$$$
  • $(function(){})与(function($){....})(jQuery)的区别
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (定时器/计数器)中断系统(详解与使用)
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三)模仿学习-Action数据的模仿
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (算法)前K大的和
  • (一)UDP基本编程步骤
  • (转)fock函数详解
  • .Net 6.0 处理跨域的方式
  • .Net CoreRabbitMQ消息存储可靠机制