1、树
定义: 树(tree)是一种非线性结构,是包含n(n>0)个结点的有穷集 ,其中:
- 每个节点有零个或多个子节点。
- 没有父节点的节点称为根节点。
- 每一个非根节点有且只有一个父节点。
- 除了根节点外,每个子节点可以分为多个不相交的子树。
相关术语:
- 树结点:包含一个数据元素及若干指向子树的分支;
- 孩子结点:结点的子树的根称为该结点的孩子;
- 双亲结点:B结点是A结点的孩子,则A结点是B结点的双亲;
- 兄弟结点:同一双亲的孩子结点;
- 堂兄结点:同一层上结点;
- 结点层次:根结点的层定义为1;根的孩子为第二层结点,依此类推;
- 树的高(深)度:树中最大的结点层
- 结点的度:结点子树的个数
- 树的度: 树中最大的结点度。
- 叶子结点:也叫终端结点,是度为0的结点;
- 分枝结点:度不为0的结点(非终端结点);
- 森林:互不相交的树集合;
- 有序树:子树有序的树,如:家族树;
- 无序树:不考虑子树的顺序;
2、二叉树
定义: 二叉树是一种特殊的树,其特点是每个结点最多有两个儿子。 二叉树使用范围最广。一颗多叉树也可以转化为二叉树。
二叉树的性质:
- 在二叉树的第 i 层上至多有 2i-1 个结点。
- 深度为 k 的二叉树上至多含 2k-1 个结点(k≥1)
- 对任何一棵二叉树,若它含有 n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0= n2+1。
- n 个结点的二叉树中,完全二叉树具有最小的路径长度。
二叉树的遍历方式:
先序遍历:先根节点 => 遍历左子树 => 遍历右子树
中序遍历:遍历左子树 => 根节点 => 遍历右子树
后序遍历:遍历左子树 => 遍历右子树 => 根节点
3、满二叉树
定义: 满二叉树就是二叉树中每个内部节点都有两个儿子,所有的叶节点都有相同的深度,是一棵深度为 k 且有 2^k-1 个结点的二叉树。
4、完全二叉树
定义: 若设二叉树的高度为h,除了第h层外,其他层的结点数都达到最大个数,第 h 层结点从左到右排列且缺若干个结点,则为完全二叉树。
完全二叉树的性质:
-
具有 n 个结点的完全二叉树的深度为 ⎣log2 n⎦+1 。
-
如果对一棵有 n 个结点的完全二叉树的结点按层序编号,则对任一结点 i (1 <= i <= n),有:
① 如果 i=1,则结点 i 无双亲,是二叉树的根;
② 如果 i>1,则其双亲的编号是 i/2(整除)。
③ 如果 2i > n,无左孩子;否则,其左孩子是结点 2i 。
④ 如果 2i+1 > n,则结点 i 无右孩子;否则,其右孩子是结点 2i+1。 -
已知完全二叉树的总节点数为 n ,其父节点个数为 n/2 。
-
已知完全二叉树的总节点数为 n 求叶子节点个数:
① 当n为奇数时:(n+1)/2
② 当n为偶数时 : (n)/2 -
已知完全二叉树的总节点数为n求叶子节点为 2 的父节点个数:
① 当n为奇数时:n/2
② 当n为偶数时:n/2 - 1
5、二叉排序树
定义: 二叉排序树(Binary Sort Tree)又称为 二叉查找树(Binary Search Tree)或 二叉搜索树 或 有序二叉树(ordered binary tree)或 排序二叉树(sorted binary tree)。二叉排序树可以是一棵空树,也可以是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
- 它的左、右子树也分别为二叉排序树。
- 没有键值相等的结点
6、平衡二叉树
定义: 平衡二叉树(Balanced Binary Tree),它可以是一棵空树,也可以是具有下列性质的二叉排序树:
- 左子树和右子树都是平衡二叉树
- 左子树和右子树的深度之差的绝对值不超过1。
平衡二叉树的常用算法有红黑树、AVL、Treap等。
7、红黑树
定义: 红黑树是一种自平衡的二叉查找树。有以下特点:
- 每个结点或是红色的,或是黑色的;
- 根结点是黑色的;
- 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的;
- 如果一个结点是红色的,则它的两个子结点都是黑色的;
- 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。
红黑树自平衡的调整操作方式就有旋转和变色两种。
红黑树是一种应用很广的数据结构,如在Java集合类中TreeSet和TreeMap的底层,C++STL中set与map,以及linux中虚拟内存的管理。
8、哈夫曼树(Huffman Tree)
定义: 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。哈夫曼编码是哈夫曼树的应用,即如何让电文中出现较多的字符采用尽可能短的编码且保证在译码时不出现歧义。
可按以下步骤建树:
- 将所有左,右子树都为空的作为根节点。
- 在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。
- 从森林中删除这两棵树,同时把新树加入到森林中。
- 重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。
9、区间树
定义: 区间树是在红黑树基础上进行扩展得到的支持以区间为元素的动态集合的操作。每个结点的关键值是区间的左端点。
通过建立这种特定的结构,可使区间的元素的查找和插入都可以在 O(lgn) 的时间内完成。相比于基础的数据结构,增加了一个max[x],即以x为根的子树中所有区间的断点的最大值。
10、线段树
定义: 线段树是一种平衡二叉查找树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。主要的处理思想是基于分治的思想。
根节点的区间为[a,b),区间长度为L = b - a的线段树的性质:
- 线段树是一个平衡树,树的高度为log(L);
- 线段树把区间上的任意长度为L的线段都分成不超过2log(L)线段。