树和二叉树

> *

重要概念:

1.树的基本概念
度(节点的度):一个节点含有的子树的个数称为该节点的度
双亲节点(父节点):若一个节点含有子节点,则这个节点称为其子节点的父节点。
兄弟节点:具有相同父节点的节点互称为兄弟节点。
树的度:一棵树中,最大的节点的度称为树的度
森林:有m(m>=0)棵互补相交的树的集合称为森林。
2.二叉树基本概念
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
二叉树的特点:
每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
二叉树的子树有左右之分,其子树的次序不能颠倒。
(2)特殊二叉树
满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
3.(1)二叉树性质:若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)(i>0)个节点
(2)若规定只有根节点的二叉树的深度为1,则深度为k的二叉树的最大节点数为(2^k)-1(k>=0)
(3)对任意一棵二叉树,如果其叶节点的个数为n0,度为2的非叶节点个数为n2, 则n0=n2+1
4.哈夫曼树
 结点的带权路径长度: 从根结点到该结点之间的路径长度与该结点的权的乘积。
 树的带权路径长度: 所有叶子结点的带权路径长度之和,记为 WPL (weighted path length)。
 哈夫曼树: 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度 (wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
5.构建哈夫曼树的步骤:
从小到大进行排序, 将每一个数据,每个数据都是一个节点,每个节点可以看成是一颗最简单的二叉树。取出根节点权值最小的两颗二叉树组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和。再将这颗新的二叉树,以根节点的权值大小再次排序,不断重复﹐1-2-3的步骤,直到数列中,所有的数据都被处理,就得到一颗哈夫曼树。
6.线索二叉树:
(1)构造线索二叉树实质上是将二叉链表中的空指针域改为前驱、后继指针域。
又因为前驱、后继的信息只有在遍历的时候才能得到,所以线索化的过程就是在遍历的时候修改空指针的过程。
(2)遍历线索二叉树
由于有了结点的前驱和后继信息,线索二叉树的遍历和指定次序下查找结点的前驱和后继算法都变得简单。
线索二叉树的遍历不需要设栈,避免了频繁的进栈、出栈,因此在时间和空间上都较遍历二叉树节省。
因此,若需要经常查找结点在所遍历线性序列中的前驱和后继,则采用线索链表作为存储结构。
1)中序线索二叉树

  1. 查找p的前驱:查左线索;若无左线索,结点的前驱是遍历左子树时访问的最后一个结点。
  2. 查找p的后继:查右线索;若无右线索,结点的后继是遍历右子树时访问的第一个结点。

2)先序线索二叉树

  1. 查找p的前驱:查左线索;若无左线索,结点的前驱是结点的双亲结点,或是先序遍历其双亲结点左子树时最后访问的结点。
  2. 查找p的后继:查右线索;若无右线索,结点的后继必为结点的左子树(若存在)或右子树根结点。

3)后序线索二叉树

  1. 查找p的前驱:查左线索;若无左线索,且无右线索时,结点的前驱是右子树根结点;若无左线索,但是有右线索时,结点的前驱是左子树根结点。
  2. 查找p的后继,这种查找比较复杂,分4类情况讨论:
    若p为二叉树的根结点,后继为空;若p为右子树根结点,后继为双亲结点;若p为左子树根结点,且无右兄弟,后继为双亲结点;若p为左子树根结点,且有右兄弟,后继为后序遍历双亲结点右子树时访问的第一个结点。

疑难问题及解决方案

1.一棵排序二叉树(即二叉搜索树BST),令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点?
首先,在BST中,最小值就是最左边的节点,最大值就是最右边的节点。
在分别求出min和max后,求出f。然后利用查找,找出一个大于f的节点就可以了。
复杂度为logN。
2.如何不用递归实现二叉树的前序/后序/中序遍历?
3. 怎么判断二叉树是否是完全二叉树

posted @ 2021-04-30 15:17  hauy77  阅读(163)  评论(0)    收藏  举报