12 常数阶 O(1) 2n+3 线性阶 O(n) 2n²+3 平方阶 O(n²) 5log2n+3 对数阶 O(logn) 2n+3nlog2n+3 nlogn阶 O(nlogn) 2n³+3 立方阶 O(n³) 2n 对数阶 O(2n)
线性表 零个或多个数据元素的有限序列
存储空间的起始位置,数组data,它的存储位置就是存储空间的存储位置 线性表的最大存储容量,数组长度maxSize 线性表当前的长度:length
数组的长度是存放线性表存储空间的长度,存储分配后容量一般不变 线性表的长度是线性表中元素的个数,会随着需求改变 任意时刻,线性表长度应小于数组长度
存储数据信息元素的域称为数据域 存储直接后继位置的域称为指针域 指针域中存储的信息称作指针或链 数据域和指针域组成数据元素的存储映像,称为节点
链表的每个节点只包含一个指针域,成为单链表
第一个节点的存储位置称为头指针,最后一个则为空 单链表的第一个节点前设一个节点,称为头节点
头指针: 链表指向第一个节点的指针,若链表有头节点,则是指向头节点的指针。 头指针具有标识作用,所以常用头指针冠以链表的名字。 无论链表是否为空,头指针均不为空,头指针是链表的必要元素。 头节点: 头节点是为了操作的统一和方便而设立的,放在第一元素的节点之前,其数据域一般无意义。也可存放链表长度。 有了头节点,对在第一元素节点前插入节点和删除第一节点,其操作和其他节点操作就统一。 头节点不一定是链表的必要元素。
对于插入和删除数据越频繁的操作,单链表的效率优势就越是明显。
3-11总结,单链表和顺序链表的优劣
树是N个节点的有限集, N=0时为空树,在任意非空树中,有且仅有一个特定的称为根(ROOT)的节点,当N>1时,其余节点可分为互不相交的有限集,其中每一个集合本身就是一棵树,并且称为根的子树。
节点拥有的子树数称为节点的度,度为0的节点称为叶节点或终端节点,度不为0的节点称为非终端节点或分支节点。
除根节点以外,分支节点也称为内部节点,树的度是树内各节点的最大值。
树中节点的最大层次称为树的深度
双亲在同一层的称为堂兄弟,同一个双亲则为兄弟
节点的子树的根称为该节点的双亲
节点的祖先是从根到该节点所经分支上的所有节点,以某节点为根的子树中的任意节点称为该节点的子孙
二叉树是N个节点的有限集合,该集合或者为空集,即空的二叉树,或者由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树构成。
特点:
每个节点最多有两棵树,可以没有
左子树和右子树有顺序,次序不能随意颠倒
即便节点只有一棵树,也要分辨左子树还是右子树
基本形态:
空二叉树,
只有一个根结点,
根结点只有左子树或者右子树,
根结点既有左子树也有右子树。
完全二叉树:
叶子节点只能出现最下两层,
最下层的叶子一定集中在左部连续位置,
倒数二层,若有叶子节点,一定都在右部连续位置,
如果节点都为1,则该结点只有左孩子,不存在右孩子,
同样节点的二叉树,完全二叉树的深度最小。
二叉树性质:
在二叉树的i层上最多有2的(i-1)次方个结点
深度为K的二叉树最多有2的K次方-1个节点
对任意一颗二叉树T,如果其终端结点数为N0,度为2的节点树为N2,则N=N2+1
具有N个节点的完全二叉树的深度为Log2N + 1
如果一颗有N个节点的完全二叉树{
如果i=1,则节点i是二叉树的根,无双亲,如果i>1,则双亲为【i/2】,
如果2i>n,则节点i无左孩子,否则其左孩子是节点2i
如果2i+1>n,则节点i无有孩子,否则其右孩子是节点2i+1
二叉树的遍历:从根节点出发,按照某种次序依次访问二叉树中所有结点,使每个结点被访问且仅访问一次。
前序遍历算法:
若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树
即从根节点开始,先遍历左子树,
中序遍历:
若二叉树为空,则空操作返回,否则先访问根节点(注意并不是先访问根节点),中序遍历左子树,中序遍历右子树
后序遍历:
若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点
层序遍历:
若二叉树为空,则空操作返回,否则从树的第一层,就是根节点开始,从上到下逐层遍历。在同一层中,从左到右的顺序对节点逐个访问。
图是由顶点的有穷非空集合和顶点之间边的集合组成。 线性表中数据元素称为元素,树中数据元素称为结点,图中数据元素称为顶点。 图结构中不允许没有顶点。图中任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示。