大话数据结构 第六章 树(二) 二叉树

二叉树

定义

  • 二叉树是n个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树构成

特点

  • 每个结点最多有两棵子树
  • 左子树和右子树的顺序不能颠倒
  • 即使某结点只有一棵子树,也要区分其是左子树还是右子树

基本形态

  • 空二叉树
  • 只有一个根节点
  • 根结点只有左子树
  • 根节点只有右子树
  • 根节点既有左子树也有右子树

特殊二叉树

  • 斜树:左斜树和右斜树
  • 满二叉树:所有分支结点都存在左子树和右子树,且所有叶子都在同一层上
  • 完全二叉树:编号为i的结点与同样深度的满二叉树编号为i的结点在二叉树中的位置完全相同

性质

性质1

  • 在二叉树的第i层上至多有2^(i-1)个结点

性质2

  • 深度为k的二叉树至多有2^k -1个结点

性质3

  • 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1

性质4

  • 具有n个结点的完全二叉树的深度为[log2 n] + 1

性质5

  • 如果对一棵有n个结点的完全二叉树的结点按层序编号,对任一结点i有:
  • 【1】如果i=1,则结点i是二叉树的根;如果i>1,则其双亲是[i/2];
  • 【2】如果2i>n,则结点i无左孩子,否则其左孩子是结点2i;
  • 【3】如果2i+1>n,则结点i无右孩子,否则其右孩子是结点2i+1

存储结构

顺序存储结构

  • 顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置也就是数组的下标要能体现结点之间的逻辑关系,把不存在的结点设置为“^”
  • 适用性不强

链式存储结构(二叉链表)

  • 设计一个数据域和两个指针域:lchild,data,rchild

遍历二叉树

  • 二叉树的遍历是指:从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次
  • 主要通过函数的递归完成

前序遍历

  • 访问根结点,然后前序遍历左子树,再前序遍历右子树
  • 具体算法:先打印,递归左子树,再递归右子树

中序遍历

  • 根节点开始(注意并不是先访问根节点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树
  • 具体算法:先递归左子树,再打印,再递归右子树

后序遍历

  • 先左到右先叶子后结点的方式遍历访问左右子树,最后是访问根节点
  • 具体算法:先递归左子树,再递归右子树,最后打印

层序遍历

  • 从数的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问

遍历的性质

  • 已知前序遍历序列和中序遍历序列,可以确定唯一二叉树
  • 已知中序遍历序列和后序遍历序列,可以确定唯一二叉树

二叉树的建立

  • 首先,需要得到原二叉树的扩展二叉树,其具体做法是将二叉树中每个结点的空指针引出一个虚结点,其值为一特定值如‘#’
  • 扩展二叉树就可以做到一个遍历序列确定一棵二叉树
  • 同样利用了递归的原理

线索二叉树

  • 把指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。
  • 实质:将二叉链表中的空指针变成相应的指向前驱和后继的线索,避免资源的浪费
  • 线索二叉树等于把一棵二叉树转变成了一个双向链表
  • 数据结构: lchild, ltag,data,rtag,rchild
  • 时间复杂度O(n)

树、森林和二叉树的转换

树转换为二叉树

  • 【1】加线。在所有兄弟结点之间加一条连线
  • 【2】去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点的连线
  • 【3】层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度使层次分明

森林转换为二叉树

  • 【1】每棵树转换为二叉树
  • 【2】第一棵二叉树不动,从第二棵开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接

二叉树转换为树(逆过程)

  • 【1】加线。
  • 【2】去线
  • 【3】结构调整

二叉树转换成森林

  • 【1】从根结点开始,若右孩子存在,则把与右孩子结点的连线删除,再查看分离后的二叉树……指导所有右孩子连线都删除为止,得到分离的二叉树
  • 【2】再把分离的二叉树各自转换为树

赫夫曼树

定义

  • 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度。树的路径长度就是从树根到每个结点的路径长度之和
  • 树的带权路径长度为树中所有叶子结点的带权路径长度之和
  • 赫夫曼树:带权路径长度WPL最小的二叉树

如何构造

  • 选取两个两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且让新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
  • 在原树中删除这两棵树,同时将新得到的二叉树加入其中
  • 重复,直到只含一棵树为止,该树即为霍夫曼树
发布了59 篇原创文章 · 获赞 3 · 访问量 1802

猜你喜欢

转载自blog.csdn.net/Felix_hyfy/article/details/99224865