树:是n(n>=0)个结点的有限集。n=0称为空树。n>0有以下特点:
特点:
- 1、有且仅有一个特点的结点,称为根节点
- 2、当n>1,其余结点可分为m(m>0)个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。
树的相关概念:
度:结点拥有的子树数目。
结点层次:从根开始定义起,根为第一层,根的孩子为第二层,以此类推。
树的深度:树中结点的最大层数称为树的深度或者高度。
二叉树:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。
特点:
1、每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。
2、左子树和右子树是有顺序的,次序不能任意颠倒。
3、即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。
满二叉树:在一棵二叉树中。如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
特点:
1、叶子只能出现在最下一层。出现在其它层就不可能达成平衡。
2、非叶子结点的度一定是2。
3、在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多。
完全二叉树:对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。(满二叉树一定是完全二叉树,但反过来不一定成立。)
特点:
1、叶子结点只能出现在最下层和次下层。
2、最下层的叶子结点集中在树的左部。
3、倒数第二层若存在叶子结点,一定在右部连续位置。
4、如果结点度为1,则该结点只有左孩子,即没有右子树。
5、同样结点数目的二叉树,完全二叉树深度最小。
二叉排序树(二叉查找树、二叉搜索树):要么是空树,要么满足以下特点:
特点:
1、若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2、若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3、 任意节点的左、右子树也分别为二叉查找树;
4、 没有键值相等的节点。
平衡二叉树(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
特点:
1、它必须是二叉查找树
2、每个节点的左子树和右子树的高度差至多为1。
红黑树(R-B Tree):它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
特点:
1、每个节点或者是黑色,或者是红色
2、根节点是黑色
3、每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
4、如果一个节点是红色的,则它的子节点必须是黑色的
5、从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
注意:
特性1中的叶子节点,是只为空(NIL或null)的节点。
特性5,确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。
二叉树的遍历:
-
前序遍历:DLR–前序遍历(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )
-
中序遍历:LDR–中序遍历(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)
-
后续遍历:LRD–后序遍历(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)
-
层序遍历:层序遍历嘛,就是按层,从上到下,从左到右遍历
时间复杂度的计算:
T(n),表示算法需要执行的运算次数。
定义:存在常数 c 和函数 f(N),使得当 N >= c 时 T(N) <= f(N),表示为 T(n) = O(f(n)) 。
算法的时间复杂度,用来度量算法的运行时间,记作: T(n) = O(f(n))。它表示随着 输入大小n 的增大,算法执行需要的时间的增长速度可以用 f(n) 来描述。
显然如果 T(n) = n^2,那么 T(n) = O(n^2),T(n) = O(n^3),T(n) = O(n^4) 都是成立的,但是因为第一个 f(n) 的增长速度与 T(n) 是最接近的,所以第一个是最好的选择,所以我们说这个算法的复杂度是 O(n^2) 。
特点:
1、当 T(n) = c,c 为一个常数的时候,我们说这个算法的时间复杂度为 O(1);如果 T(n) 不等于一个常数项时,直接将常数项省略。
2、如果一个算法的执行次数是 T(n),那么只保留最高次项,同时忽略最高项的系数后得到函数 f(n),此时算法的时间复杂度就是 O(f(n))。为了方便描述,下文称此为 大O推导法。