·
顺序存储结构
既是逻辑相邻也是物理相邻,可以用静态数组方法实现也可以用动态数组方法实现。对于前者在编译之前必须制定需要分配多大的空间,使用完成之后,系统自动释放;对于后者,需要用
new
来分配空间,大小可以有变量指定,具体值是在运行时确定的,使用完成之后必须由
delete []
释放。
·
顺序存储结构
分为两大类:顺序结构和链式结构。
顺序结构:
顺序表(有序表,无序表),顺序队列(有序队列,循环队列,优先级队列),顺序堆栈。链式结构:链表(单链表,单循环链表,双向循环链表),链式队列和链式堆栈,为了操作方便,链表一般要带个头节点,链栈一般不需要头节点。对于顺序栈,操作一般在数组的高地址端进行,而对于链栈,操作一般在头指针处进行
,
链式队列也一般不带头指针
·
链式存储结构
:逻辑相邻的元素,物理上不一定相邻,通过动态申请地址空间实现
·
在链式存贮结构的析构函数中一定要记得用
delete
释放所有节点的空间,因为节点的空间是用
new
分配的。同样删除一个节点也要用
delete
去释放其空间
·
递归调用通常用“运行时栈”来保存上次调用的临时变量,该次调用的返回地址,返回值和函数参数等
·
因为递归调用的效率通常都是很差的,故一般用循环来代替递归,但并不是所有的递归结构都可以用循环来代替。常有尾递归,单向递归可以用循环来代替。还有一类递归可以通过模拟系统的运行时栈来消除递归。
·
尾递归:即是在函数的末尾进行递归调用,因为这样的话,其实调用时,函数的返回地址,返回值和参数都是按正常顺序压入运行时栈的,故递归返回时,这些参数实际没有作用。
·
单向递归:递归函数中虽然有一处以上的递归调用,但是各次递归调用相互参数无关。
·
递归的算法思想(包括递推和基准条件):
第一点:考虑递归的出口(基准条件);第二点:就假设内部递归调用满足了第
N
步的要求,在此基础上考虑如何实现第
N
+
1
步的要求(递推)。当递归完全返回时,递归结束。
·
关于树的一些概念:节点的度:节点所拥有的子树的个数;树的度:节点度中最大的一个;节点的层次:从第
0
层开始;树的深度:所有节点层次最大值。
·
树的孩子兄弟节点表示法利于把树与二叉树的互换。
·
满二叉树:每个节点都有存在左子树和右子树,且所有叶节点都在同一层。完全二叉树:从上到下,每一层依次填满的排列。满二叉树一定是完全二叉树。
|
插入
|
希尔
|
选择
|
堆
|
交换(冒泡)
|
快速
|
归并
|
基数
(m:
位
)
|
T
|
N
(
2
)
|
N
(
ln
(
n
)平方)
|
N
(
2
)
|
ln n
|
N
(
2
)
|
Nlnn
|
nLnn
|
Mn
|
S
|
1
|
1
|
1
|
1
|
1
|
Nlnn
|
Nlnn
|
N
|
稳定
|
Y
|
N
|
Y
|
N
|
Y
|
N
|
Y
|
Y
|
·
内排序:插入排序:一次选择元素,比较插入适当的位置。希尔排序:把待排序数组分为若干个小组,每个小组内采用直接插入排序,逐步扩大分组,直到排序完成。选择排序:首先从待排序列中选出最小的,放在第一个位置,然后在剩余的书中选择第二小的放在第二个位置。堆排序:建立一个最小值堆,然后每次取其根结点值。快速排序:先找到一个轴值,然后从两边开始扫描,大于他的放在右边,小于他的放在左边,然后分别对左右递归。归并排序:把待排序列分为组,每相邻两组合并。基数排序:从个位开始排序,分别放入各自的队列中,然后收集起来,按十位排序。。。
·
二叉树的游标遍历
:
前序遍历
:
把根节点
(
第一次
)
或者当从栈中弹出一个元素就把其对应的右子树根节点和左子树根节点分别入栈
;
中序遍历
:
选循环入栈左子树的最左边全部左子节点
,
然后访问出栈访问左子节点
,
然后访问父节点
,
再把其右子树的所有左子节点入栈
…
直到栈为空
;
层次遍历
:
使用队列
,
先入根节点
,
出栈则把相应的左字节点和右子节点入栈
;
后序遍历
:
·
堆
是节点间数据元素的关键码具有层次次序关系的完全二叉树
(
也就是说父节点
>=
字节点
,
但是兄弟节点之间没有大小关系
).R&B
树
:
左子树的所有值
<=
父节点
<
右子树的所有值