当前位置:   article > 正文

数据结构与算法(C语言 严蔚敏)五-树和二叉树_线索二叉树严蔚敏

线索二叉树严蔚敏


树的定义和基本术语

树的定义

树的结构: 每个结点(除根结点)都有且仅有一个直接前趋,所有结点有且仅有零个或多个直接后继。
树的特点:

  • 根结点没有前驱,而除根结点外的所有结点有且仅有一个前驱。
  • 所有结点看可以有零个或多个后继。
  • n 个结点的树有 n-1 条边。

基本术语

结点(node):表示树中的元素,包括数据项及若干指向其子树的分支。
结点的度(degree):结点拥有的子树个数。
树的度:数中结点的度的最大值。
叶子(leaf):度为0的结点。
孩子(child): 结点的子树称为该结点的孩子。
双亲(parents): 孩子结点的上层结点叫该结点的双亲。
兄弟(sibling): 同一双亲的孩子。
结点的层次(level): 从根结点算起,根为第一层,它的孩子结点为第二层……。
结点的深度: 从根开始向下累加。
结点的高度: 从叶结点向上累加。
树的深度/高度(depth): 树中结点的最大层次数。
森林(forest): m棵(m>=0)互不相交的树的集合
有序树:树中结点的子树从左往右是有序且不可互换的。
无序树:不是有序树那就是无序树。

二叉树的定义、性质、存储、遍历

二叉树的定义

一般定义:二叉树是n(n>=0)个结点的有限集合,由一个根结点和两棵称为左子树和右子树的互不相交的二叉树构成。
满二叉树:二叉树的所有结点都存在左子树和右子树,并且所有叶子结点都在同一层上。
完全二叉树:二叉树的每个结点都与满二叉树中结点的编号对应,且深度为k的完全二叉树在k-1层上一定是满二叉树。

注意,完全二叉树是由满二叉树推导而出的,其有两大特点:

  • 叶子结点必然只会出现在层次最大的两层。
  • 对任意结点,若其左分支深度为l,那么其左分支必定是l或l+1.

二叉树的形态:仅有根结点、根和左子树、跟和右子树、空树(n=0)。

二叉树的性质

  1. 在二叉树的 i 层上最多有2i-1个结点。如,一个满二叉树每层对应结点数是:1 2 4 8 16 … 。
  2. 一棵深度为k的二叉树中最多有2k-1个结点;具有2k-1个结点的树是满二叉树。
  3. 对于一棵非空的二叉树,如果叶子结点数为n0 ,度数为2的结点数为n2 ,则有: n0 = n2 +1
  4. 具有n个结点的完全二叉树的深度k为 ⌊ log2n ⌋+1
  5. 完全二叉树中任意一个编号为 i 的结点:左孩子结点编号为2i;右孩子结点编号为 2i+1;双亲结点的编号为 ⌊ i/2 ⌋(i != 1);若 i=1,则该结点是二叉树的根,无双亲;若 2i>n,则该结点无左孩子;若 2i+1>n,则该结点无右孩子结点;

二叉树的顺序和链式存储

二叉树的顺序存储

顺序存储的定义:以数组的方式用一组连续地址从上到下,从左到右的依次存放结点元素。以0代替没有的结点。
元素的访问方式参考二叉树的性质部分。

注意:
由于是以0代替没有的结点,所以对于一般二叉树、左分支、右分支而言会造成浪费,只适合存放完全二叉树或满二叉树。

抽象数据描述:略。

二叉树的链式存储

二叉链表:含有两个指针域,其形式为:

lchilddatarchild

三叉链表:含有三个指针域,其形式为:

lchilddataparentrchild

抽象数据描述:略。

二叉树的遍历和线索二叉树

二叉树的遍历

遍历方式:

  • 先序:根、左子树、右子树。(DLR)
  • 中序:左子树、根、右子树。(LDR)
  • 后序:左子树、右子树、根。(RLD)
  • DRL
  • RDL
  • RLD

遍历算法描述

  • 先序遍历递归算法。

  • 先序遍历非递归算法。

  • 中序遍历递归算法。

  • 中序遍历非递归算法。

  • 后序遍历递归算法。

  • 后序遍历非递归算法。

根据遍历序列恢复二叉树

  • 结论 1:已知前序序列和中序序列,可以唯一确定二叉树
  • 结论 2:已知后序序列和中序序列,可以唯一确定二叉树
  • 结论 3:已知前序序列和后序序列,不能唯一确定二叉树
  • 结论 4:通过根,一切迎刃而解。
    例题:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    按层次遍历二叉树:是指从二叉树的第一层(根结点)开始,从上至下从左到右的顺序对结点逐个访问。
    在这里插入图片描述

线索二叉树

什么是线索二叉树:线索二叉树能在一次遍历后记忆某结点的前驱或者后继。
结构

ltaglchilddatarchildrtag

l/rtag:0 指向结点的左/右孩子。1 指向结点的前驱/后继结点。
在这里插入图片描述

线索二叉树的算法描述

树和森林

树的存储结构

  • 双亲表示法: 结点由数据和双亲位置构成;

优势:便于查找双亲结点,结构简单,便于操作。
劣势:求孩子结点需遍历整棵树。

  • 孩子链表表示法:树的结点由数据和孩子结点位置构成;

优势:便于查找孩子结点
劣势:找双亲结点很复杂

  • 双亲孩子表示法:树的结点由双亲位置、数据和孩子结点位置构成;

  • 优点:便于查找双亲结点和孩子结点;

  • 劣势:存储密度小,空间开销大。

  • 孩子兄弟表示法(左孩子-右兄弟):firstchild data nextsibling

树与二叉树的转换

树转换为二叉树

  1. 兄弟加线。
  2. 保留双亲与第一孩子连线,删去与其他孩子的连线。
  3. 以树的根结点为轴心顺时针转动,使之层次分明。

森林转换为二叉树

把森林中第二棵树的根结点看成是第一棵树的根结点的兄弟,就可以推导出森林和二叉树的对应关系。

二叉树转换为树和森林

在这里插入图片描述

树的遍历方法

深度优先

  • 先序遍历(与二叉树同理)
  • 中序遍历(与二叉树同理)

宽度优先

  • 层次遍历

二叉树的应用

赫夫曼树

相关概念

二叉树的路径长度:由根结点到所有叶子结点的路径长度之和。
二叉树的带权路径长度:从根结点到各个叶子结点的路径长度与相应结点权值的乘积之和。
赫夫曼(Huffman)树:也称最优二叉树,是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度的二叉树。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

赫夫曼编码

在这里插入图片描述

赫夫曼树和赫夫曼编码

在赫夫曼编码树的带权路径长度就是电文的代码总长,所以采用赫夫曼树构造的编码是一种能使电文代码总长最短的不等长编码。
在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号