树的一些重要的名词解释
- 高度:当前节点到叶子节点的最长路径
- 深度:根节点到当前节点经过的边数
- 层数:节点的深度+1 树的高度:即根节点的高度(就是根节点到叶子节点的最长路径)
- 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
- 子节点:一个节点包含的子树节点
- 兄弟节点:具有相同父节点的节点称为兄弟节点
- 叶节点:没有子节点的节点(也叫页子节点)
二叉树
二叉树的性质
- 二叉树中,第
i
层最多有2^(i - 1)
个结点。 - 如果二叉树的深度为 K,那么此二叉树最多有
2^K-1
个结点。 - 二叉树中,叶子结点数为 n0,度为 2 的结点数为 n2,则
n0=n2+1
(推导公式 : n0+n1+n2=n1+2*n2+1 =》n0=n2+1)
满二叉树
满二叉树除了满足普通二叉树的性质,还具有以下性质:
- 满二叉树中第 i 层的节点数为 2^(n-1)个。
- 深度为 k 的满二叉树必有
2 ^k-1
个节点 ,叶子数为 2 ^ (k-1)。 - 满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶子节点都在最底层。
- 具有 n 个节点的满二叉树的深度为 log2(n+1)。
完全二叉树
如果二叉树中最后一层节点未满,但最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
完全二叉树除了具有普通二叉树的性质,它自身也具有一些独特的性质
-
n 个结点的完全二叉树的深度为 ⌊log2n⌋+1。
-
对于任意一个结点 i ,完全二叉树还有以下几个结论成立:
- 当 i>1 时,父亲结点为结点 [i/2] 。(i=1 时,表示的是根结点,无父亲结点)
- 如果 2i>n(总结点的个数) ,则结点 i 肯定没有左孩子(为叶子结点);否则其左孩子是结点 2i 。
- 如果 2i+1>n ,则结点 i 肯定没有右孩子;否则右孩子是结点 2i+1 。
四种遍历方式
先序遍历
中序遍历
后序遍历
层序遍历
时间复杂度:O(N)
二叉排序树BST(Binary Search Tree)
有什么用?
目的是为了提高查找的性能,使其查找在平均和最坏的情况下都是logn
级别,接近二分查找.
什么样才叫二叉排序树?
- 如果它的左子树不为空,那么左子树上的所有结点的值均小于它的根结点的值
- 如果它的右子树不为空,那么右子树上的所有结点的值均大于它的根结点的值
- 根结点的左子树和右子树也都是二叉排序树
重要特点:
中序遍历二叉排序树便可得到一个有序序列
严格平衡二叉树
平衡二叉树也称为AVL树,在二叉搜索树的基础上,平衡二叉树还需要满足如下条件:
- 左右两个子树的高度差(平衡因子)的绝对值不超过1
- 左右两个子树都是一棵平衡二叉树
为什么需要
二叉查找树可能不平衡,计算情况下退化为链表。
平衡二叉树的目的就是为了在二叉查找树的基础上保证平衡性。提高查找速度。
缺点:
虽然查询更快了,但是保证平衡的自旋使得增删性能低下。
平衡因子
节点的左子树的高度减去右子树的高度(反之同理).
由此可知平衡二叉树是每个结点的平衡因子都为 1、-1、0
的二叉排序树,所以平衡二叉树一定是二叉搜索树.
插入元素若出现不平衡怎么办呢?
自旋
根据新插入的结点与最低不平衡结点的位置关系进行相应的调整。分为LL型、RR型、LR型和RL型
4种类型,详见
哈夫曼树
前置知识
- 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。从根结点到结点 a 之间的通路就是一条路径。
- 路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。
- 结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。图 1 中结点 a 的权为 7,结点 b 的权为 5。
- 结点的带权路径长度:指的是从根结点到该结点之间的
路径长度与该结点的权的乘积
。图 1 中结点 b 的带权路径长度为 2 * 5 = 10 。 树的带权路径长度
:为树中所有叶子结点的带权路径长度之和。通常记作 “WPL”。
例如图 1 中所示的这颗树的带权路径长度为WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3
什么是哈夫曼树
当用 n 个结点试图构建一棵树时,所有能构建的树中带权路径长度最小
的那颗树。
要使树的带权路径长度最小,只需要遵循一个原则:权重越大的结点离树根越近
哈夫曼编码
哈夫曼编码就是在哈夫曼树的基础上构建的,这种编码方式最大的优点就是用最少的字符包含最多的信息内容。
根据发送信息的内容,通过统计文本中相同字符的个数作为每个字符的权值,建立哈夫曼树。对于树中的每一个子树,统一规定其左孩子标记为 0 ,右孩子标记为 1 。这样,用到哪个字符时,从哈夫曼树的根结点开始,依次写出经过结点的标记,最终得到的就是该结点的哈夫曼编码。