二叉树

来源:互联网 发布:知乎 天使投资人 编辑:程序博客网 时间:2024/06/09 22:14

二叉树是一种比较常见的树,其加在树上的限制是树的度为2。每个节点的两棵子树分别为其左子树和右子树。

一、基本概念

1.1 二叉树的性质

二叉树的度为2,它具有如下性质:

  • 一棵非空二叉树的第i 层上最多有2i-1 个节点(i≥1)
  • 一棵深度为k 的二叉树中,最多具有2k-1 个节点
  • 对于一棵非空的二叉树,如果叶子节点数为n0,度数为2 的节点数为n2,则有:n0=n2+1。
    • 证明设n 为二叉树的节点总数,n1 为二叉树中度为1 的节点数,则有:
    • n=n0+n1+n2 
    • 在二叉树中,所有节点之间的关系用一条边表示,假设树中边的数目为X。根据前驱关系,除根节点外,所有其它节点都有唯一的前驱,所以
    • X=n-1 
    • 根据后继关系所有边都由度为1 和度为2 的节点发出所以
    • B=n1+2 * n2 
    • 所以可得
    • n0=n2+1
  • 具有n 个节点的完全二叉树的深度k 为“[log2n]向下取整+1”。
下图即为一棵二叉树:


1.2 满二叉树

如果一棵二叉树除了最后一层无任何子节点外,每一层上的所有节点都有两个子节点,则该二叉树就是一棵满二叉树。满二叉树的所有叶子都在最后一层,且深度为k的满二叉树具有2k-1 个节点。

下图即为一棵满二叉树:


1.3 完全二叉树

如果一棵二叉树满足以下性质,则它是一棵完全二叉树:对于具有n 个节点的二叉树,如果按照从上至下和从左到右的顺序对二叉树中的所有节点从1 开始顺序编号,则对于任意的序号为i 的节点,有:

  • 如果i>1,则序号为i 的节点的父节点的序号为i/2;如果i=1,则序号为i 的节点是根节点,无父节点。
  • 如果2i≤n,则序号为i 的节点的左孩子节点的序号为2i;如果2i>n,则序号为i 的节点无左孩子。
  • 如果2i+1≤n,则序号为i 的节点的右孩子节点的序号为2i+1;如果2i+1>n,则序号为i 的节点无右孩子。
下图即为一棵完全二叉树:


二、二叉树的基本操作

对于树的操作主要包括添加节点、删除节点、遍历节点。其它操作都可以在这几个操作的基础上进行,比如求树的深度、查找某个节点都可以在遍历的基础上进行,创建树实际上即为往一棵空树中添加节点。

2.1 添加

在往树中添加节点时,如果树为空,则添加的新的节点将成为树的根节点(也是该树的当前的唯一的叶子节点),如果树不为空,则取决于所采取的策略,可能递归的往根的左子树或者右子树添加,最终的结果是使得新节点成为原树中某个叶子的子树,新节点成为树的一个新的叶子,而它所添加到的那个原树的叶子节点成为一个新的非叶子节点。下图即为一个例子:


2.2 删除节点

相对于添加节点,删除节点要稍微复杂些,因为删除的节点可能是不同的角色。

  • 如果删除的是一个叶子节点,直接删除即可
  • 如果删除的不是叶子节点,并且
    • 如果该节点有左孩子(右孩子),但是没有右孩子(左孩子),则将该节点删除,同时将其左孩子(右孩子)提到该节点所处的位置(即使得被删除节点的左(右)孩子成为其父节点的左孩子或者右孩子,是左孩子还是右孩子取决于被删除节点在其父节点的孩子中的位置)
    • 如果该节点既有左孩子节点也有右孩子节点,假设该节点为A,其左孩子为B,右孩子为C,则将节点A删除,同时将B提到该节点的位置,并将节点C当做B的右孩子;或者将节点A删除,同时将C提到该节点的位置,并将节点B当做C的左孩子

下图为删除节点前的二叉树:


下图为删除节点21后的树


2.3 遍历树

除了先根遍历、后根遍历和层次遍历之外,二叉树的遍历还有一种中根遍历。中根遍历也可以采用递归算法,其算法描述如下:

  1. 如果存在左子树,则递归的遍历其左子树
  2. 访问根节点
  3. 如果存在右子树,则递归的遍历其右子树

三、哈夫曼树

给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。

3.1 基本概念

3.1.1 路径和路径长度

在一棵树中,从一个节点到其子孙节点所经过的通路称为路径。通路中边(即节点之间连接线)的数目称为路径长度。显然从根节点到第L层节点的路径长度为L-1。

3.1.2 节点的权及带权路径长度

给树的节点赋予一个含有某种意义的数值,该数值就称为该节点的权。节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积。

3.1.3 树的带权路径长度

树的带权路径长度为所有叶子节点的带权路径长度之和,记为WPL。

3.2  哈夫曼树的构造

哈夫曼提出了构造最优二叉树的算法,因此最优二叉树又称为哈弗曼树。假设有n个权值 w1、w2、…、wn,则构造出的哈夫曼树有n个叶子节点,相应的算法如下:
  1. 将w1、w2、…,wn看成是有n 棵二叉树(每棵树仅有一个结点);
  2. 从二叉树的集合中选出两个根节点的权值最小的树,将它们合并为一棵新的二叉树。这两个节点分别为新的二叉树的左、右子树,且新树的根节点的权值为其左、右子树根节点权值之和
  3. 重复第2步,直到只剩一棵树为止,该树即为所求得的哈夫曼树
哈夫曼树极其有用,在信息编码领域,可以将字符出现的频率当做权重构造一棵包含字符数目个叶子的哈弗曼树,然后根据哈弗曼树对字符进行编码(比如左子树为0,右子树为1),这样就可以降低整个信息所需的比特数目。

原创粉丝点击