二万字《算法和数据结构》三张动图,三十张彩图,C语言基础教学,之 二叉搜索树详解 (建议收藏)

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二万字《算法和数据结构》三张动图,三十张彩图,C语言基础教学,之 二叉搜索树详解 (建议收藏)相关的知识,希望对你有一定的参考价值。

本文已收录于专栏
🌳《画解数据结构》🌳

前言

  我们知道,「 顺序表 」 可以 「 快速索引 」 数据,而 「 链表 」 则可以快速的进行数据的「 插入 和 删除 」。那么,有没有一种数据结构,可以快速的实现 「 增 」「 删 」「 改 」「 查 」 呢?
  本文,我们就来聊一下一种 「 树形 」 的数据结构,它既有链表的快速插入与删除的特点,又有顺序表快速查找的优势。它就是:

「 二叉搜索树 」


二叉树的查找

二叉搜索树的删除

二叉搜索树的插入

点击我跳转末尾 获取 粉丝专属 《算法和数据结构》源码。

一、二叉树的概念

  在学习二叉搜索树之前,我们首先需要了解下什么是二叉树。

1、二叉树的性质

  二叉树是一种树,它有如下几个特征:
    1)每个结点最多 2 棵子树,即每个结点的孩子结点个数为 0、1、2;
    2)这两棵子树是有顺序的,分别叫:左子树 和 右子树;
    3)如果只有一棵子树的情况,也需要区分顺序,如图所示:

   b b b a a a 的左子树;

   c c c a a a 的右子树;

2、特殊二叉树

1)斜树

  所有结点都只有左子树的二叉树被称为左斜树。

  所有结点都只有右子树的二叉树被称为右斜树。

  斜树有点类似线性表,所以线性表可以理解为一种特殊形式的树。

2)满二叉树

  对于一棵二叉树,如果它的所有根结点和内部结点都存在左右子树,且所有叶子结点都在同一层,这样的树就是满二叉树。

  满二叉树有如下几个特点:
    1)叶子结点一定在最后一层;
    2)非叶子结点的度为 2;
    3)深度相同的二叉树,满二叉树的结点个数最多,为 2 h − 1 2^h-1 2h1(其中 h h h 代表深度)。

3)完全二叉树

  对一棵具有 n n n 个结点的二叉树按照层序进行编号,如果编号 i i i 的结点和同样深度的满二叉树中的编号 i i i 的结点在二叉树中位置完全相同,则被称为 完全二叉树

  满二叉树一定是完全二叉树,而完全二叉树则不一定是满二叉树。
  完全二叉树有如下几个特点:
    1)叶子结点只能出现在最下面两层。
    2)最下层的叶子结点一定是集中在左边的连续位置;倒数第二层如果有叶子结点,一定集中在右边的连续位置。
    3)如果某个结点度为 1,则只有左子树,即 不存在只有右子树 的情况。
    4)同样结点数的二叉树,完全二叉树的深度最小。

  如下图所示,就不是一棵完全二叉树,因为 5 号结点没有右子树,但是 6 号结点是有左子树的,不满足上述第 2 点。

3、二叉树的性质

  接下来我们来看下,二叉树有哪些重要的性质。

1)性质1

  【性质1】二叉树的第 i ( i ≥ 1 ) i (i \\ge 1) i(i1) 层上至多有 2 i − 1 2^{i-1} 2i1 个结点。

  既然是至多,就只需要考虑满二叉树的情况,对于满二叉树而言,当前层的结点数是上一层的两倍,第一层的结点数为 1,所以第 i i i 的结点数可以通过等比数列公式计算出来,为 2 i − 1 2^{i-1} 2i1

2)性质2

  【性质2】深度为 h h h 的二叉树至多有 2 h − 1 2^{h}-1 2h1 个结点。

  对于任意一个深度为 h h h 的二叉树,满二叉树的结点数一定是最多的,所以我们可以拿满二叉树进行计算,它的每一层的结点数为 1 1 1 2 2 2 4 4 4 8 8 8、…、 2 h − 1 2^{h-1} 2h1
  利用等比数列求和公式,得到总的结点数为:
1 + 2 + 4 + . . . + 2 h − 1 = 2 h − 1 1 + 2 + 4 + ... + 2^{h-1} = 2^h - 1 1+2+4+...+2h1=2h1

3)性质3

  【性质3】对于任意一棵二叉树 T T T,如果叶子结点数为 x 0 x_0 x0,度为 2 的结点数为 x 2 x_2 x2,则 x 0 = x 2 + 1 x_0 = x_2 + 1 x0=x2+1

  令 x 1 x_1 x1 代表度 为 1 的结点数,总的结点数为 n n n,则有:
n = x 0 + x 1 + x 2 n = x_0 + x_1 + x_2 n=x0+x1+x2
  任意一个结点到它孩子结点的连线我们称为这棵树的一条边,对于任意一个非空树而言,边数等于结点数减一,令边数为 e e e,则有:
e = n − 1 e = n-1 e=n1

  对于度为 1 的结点,可以提供 1 条边,如图中的黄色结点;对于度为 2 的结点,可以提供 2 条边,如图中的红色结点。所以边数又可以通过度为 1 和 2 的结点数计算得出: e = x 1 + 2 x 2 e = x_1 + 2 x_2 e=x1+2x2  联立上述三个等式,得到: e = n − 1 = x 0 + x 1 + x 2 − 1 = x 1 + 2 x 2 e = n-1 = x_0+x_1+x_2 - 1 = x_1 + 2 x_2 e=n1=x0+x1+x21=x1+2x2  化简后,得证:
x 0 = x 2 + 1 x_0 = x_2 + 1 x0=x2+1

4)性质4

  【性质4】具有 n n n 个结点的完全二叉树的深度为 ⌊ l o g 2 n ⌋ + 1 \\lfloor log_2n \\rfloor + 1 log2n+1

  由【性质2】可得,深度为 h h h 的二叉树至多有 2 h − 1 2^{h}-1 2h1 个结点。所以,假设一棵树的深度为 h h h,它的结点数为 n n n,则必然满足:
n ≤ 2 h − 1 n \\le 2^{h}-1 n2h1  由于是完全二叉树,它一定比深度为 h − 1 h-1 h1 的结点数要多,即:
2 h − 1 − 1 < n 2^{h-1}-1 \\lt n 2h11<n  将上述两个不等式,稍加整理,得到:
2 h − 1 ≤ n < 2 h 2^{h-1} \\le n \\lt 2^h 2h1n<2h  然后,对不等式两边取以2为底的对数,得到: h − 1 ≤ l o g 2 n < h h-1 \\le log_2n \\lt h h1log2n<h  这里,由于 h h h 一定是整数,所以有: h = ⌊ l o g 2 n ⌋ + 1 h = \\lfloor log_2n \\rfloor + 1 h=log2n+1

二、二叉树的存储

1、顺序表存储

  二叉树的顺序存储就是指利用数组对二叉树进行存储。结点的存储位置即数组下标,能够体现结点之间的逻辑关系,比如父结点和孩子结点之间的关系,左右兄弟结点之间的关系 等等。

1)完全二叉树

  来看一棵完全二叉树,我们对它进行如下存储。
《画解数据结构》C语言基础讲解,三张动图,三十张彩图,画解二叉搜索树 (建议收藏)

《画解数据结构》C语言基础讲解,三张动图,三十张彩图,画解二叉搜索树 (建议收藏)

❤️《算法和数据结构》小白零基础教学,三十张彩图,C语言配套代码,之 二叉树详解❤️(建议收藏)

❤️《算法和数据结构》小白零基础教学,三十张彩图,C语言配套代码,之 二叉树详解❤️(建议收藏)

❤️《画解数据结构》两万字,十张动图,画解双端队列❤️(建议收藏)

❤️《画解数据结构》两万字,十张动图,画解双端队列❤️(建议收藏)