二叉树概述

235 阅读5分钟

树形结构

树:是一种典型的非线性结构。任意一个结点的直接前驱,如果存在,则一定是唯一的,直接后继如果存在,则可以有多个,即一对多的关系。

日常生活中的树: image.png

image.png

一般把 树 倒过来看,可以将其归纳为下面这样的结构,即数据结构中的 树:

树:

image.png

基本概念

image.png :一棵树是由 N(N>0)个元素组成的有限集合。如上图。
结点:使用树结构存储的每一个数据元素都被称为“结点”。如上图中,数据元素 A(B、C...) 就是结点;
空树:棵树可以没有任何节点,称为空树。

空树中没有结点。

根节点: 一棵树可以只有 1 个节点,也就是只有根节点。每一个非空树都有且只有一个被称为根的结点。图中,结点 A 就是整棵树的根结点。

树根的判断依据为:如果一个结点没有父结点,那么这个结点就是整棵树的根结点。

父结点(双亲结点)、子结点和兄弟结点:对于图中的结点 A、B、C、D 来说,A 是 B、C、D 结点的父结点(也称为“双亲结点”),而 B、C、D 都是 A 结点的子结点(也称“孩子结点”)。对于 B、C、D 来说,它们都有相同的父结点,所以它们互为兄弟结点。

叶子结点:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)。如图中,结点 K、L、F、G、M、I、J 都是这棵树的叶子结点。

节点的度(degree):子树的个数。节点A的度为 3,节点C的度为 1,节点K的度为 0。
树的度:所有节点度中的最大值。图中树的度为 3,A、D节点的度为3,是所有节点中度最大的节点。

结点的层次:设根结点层次为1,其余结点为其双亲结点层次加1,例如,A 层次为1,B、C、D 层次为 2,...

节点的深度(depth):从根节点到当前节点的唯一路径上的节点总数

节点的高度(height):从当前节点到最远叶子节点的路径上的节点总数

树的深度:所有节点深度中的最大值

树的高度:所有节点高度中的最大值

树的深度 等于 树的高度

二叉树

满足以下两个条件的树就是二叉树:

  • 本身是有序树;
  • 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2。

即使某节点只有一棵子树,也要区分左右子树

image.png

image.png

二叉树的性质

1、二叉树中,第 i 层最多有 2i-1 个结点。
2、如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。
3、二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。

对于一个二叉树来说,除了度为 0 的叶子结点和度为 2 的结点,剩下的就是度为 1 的结点(设为 n1),那么总结点 n=n0+n1+n2。同时,对于每一个结点来说都是由其父结点分支表示的,假设树中分枝数为 B,那么总结点数 n=B+1。而分枝数是可以通过 n1 和 n2 表示的,即 B=n1+2n2。所以,n 用另外一种方式表示为 n=n1+2n2+1。两种方式得到的 n 值组成一个方程组,就可以得出 n0=n2+1。

image.png

满二叉树

满二叉树:所有节点的度都要么为 0,要么为 2。且所有的叶子节点都在最后一层。

image.png

满二叉树除了满足普通二叉树的性质,还具有以下性质:

  • 满二叉树中第 i 层的节点数为 2n-1 个。
  • 深度为 k 的满二叉树必有 2k-1 个节点 ,叶子数为 2k-1
  • 满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶子节点都在最底层。
  • 具有 n 个节点的满二叉树的深度为 log2(n+1)。

完全二叉树

对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

叶子节点只会出现最后 2 层,且最后 1 层的叶子结点都靠左对齐。
完全二叉树从根结点至倒数第 2 层是一棵满二叉树。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

判断是不是完全二叉树:一棵二叉树只有最下面两层结点的度可以小于2,并且最下面一层的结点都集中在该层最左边的连续位置上,此树可以成为完全二叉树。

image.png

image.png

完全二叉树的性质:

  • 度为 1 的节点只有左子树;
  • 度为 1 的节点要么是 1 个,要么是 0 个;
  • 同样节点数量的二叉树,完全二叉树的高度最小。

假设完全二叉树的高度为 h( h ≥ 1 ),那么:
1)至少有 2h-1 个节点 ( 20 + 21 + 22 + ⋯+ 2h-2 + 1 );
2) 最多有 2h − 1 个节点( 20 + 21 + 22 + ⋯+ 2h-1 );
3) 假设总节点数量为 n
  2h-1 ≤ n < 2h
  h − 1 ≤ log2n < h
  h = floor( log2n ) + 1
  floor 是向下取整,另外,ceiling 是向上取整。
4)一棵有 n 个节点的完全二叉树(n > 0),从上到下、从左到右对节点从 1 开始进行编号,对任意第 i 个节点:
 如果 i = 1 ,它是根节点
 如果 i > 1 ,它的父节点编号为 floor(i / 2)
 如果 2i>n(总结点的个数),则结点 i 肯定没有左孩子(为叶子结点);否则其左孩子是结点 2i 。
 如果 2i+1>n ,则结点 i 肯定没有右孩子;否则右孩子是结点 2i+1 。
 如果 2i + 1 ≤ n ,它的右子节点编号为 2i + 1。