NoteDeep
冒泡排序法
P51,算法性能
因为每一趟扫描都会记录是否发生了交换,如果没发生交换则排序完成不再扫描,所以最好的情况下时间复杂度为O(n)
最坏情况下的比较次数为(n-1)+(n-2)+...+1=n(n-1)/2

约瑟夫问题
P129,循环链表





多项式链表的相加
P155,单链表




多进制输出
P177,栈


括号匹配(栈的应用1)
P182,栈


表达式转换(栈的应用2)
P196,栈,栈内栈外操作符优先级






利用后缀表达式计算表达式的值(栈的应用)
P187,栈,相对简单,无需考虑操作符优先级


汉诺塔问题
P213,栈,递归


斐波那契数列求第k项的递归调用的次数
P225,栈,递归调用树


斐波那契数列改进
P228,单调递归,尾递归


尾递归——不压栈的递归
这个例子起始不大能说明问题,其实尾递归比普通递归效率要高,所以不需要消除尾递归

迷宫问题
P231,回溯法
利用栈进行深度优先搜索即可

逐行打印二项式系数
P254,队列



二叉树后序遍历的非递归算法
P314,栈
方法1:通过给节点设置L、R标签,如果栈顶的是非空节点且标签为L,则在回退时访问该节点的右子树
如果栈顶是非空节点且标签为R则在退回时将该节点出栈,访问其根节点
方法2:设置一个count,记录每个节点的回退次数,第一次回退到该节点的啥时候访问右节点,第二次
回退到该节点的时候将该节点出栈,访问其根节点
需要待左右节点都出栈后,双亲节点才能出栈,每个节点在出栈的时候输出其val,这样就得到后序序列

二叉树中序遍历的非递归算法
P320,栈
进栈顺序为双亲节点先进栈,然后访问左子节点;当双亲节点出栈的时候右子节点进栈;
每个节点在出栈的时候输出其val,这样就得到中序序列

二叉树前序遍历的非递归算法
P325,栈
进栈顺序为双亲节点先进栈,然后访问左子节点;当双亲节点出栈的时候右子节点进栈;
每个节点在进栈的时候输出其val,这样就得到前序序列

二叉树层序遍历的非递归算法
P329,队列
每个节点出队时,都将其左右子节点入队
每个节点均在入队(或出队)时输出其val,这样就得到层序序列

前序和中序序列建立二叉树的递归算法
P335
每次递归中,都定位前序序列第一个元素在中序序列中的位置,即可得到左子树和右子树的序列,从而可以进行下一步递归

广义表建立二叉树
P336




卡特兰数(有n个节点的不同二叉树有多少种)
P346
可以通过讨论左右子树不同情况,递推、计算卷积得出

中序线索二叉树寻找某节点的前驱和后继
建立中序线索二叉树
P356
线索二叉树就是添加了线索的二叉树,线索即指向前驱和后继的指针



三元组表示的稀疏矩阵的快速转置




KMP算法





顺序搜索有序表的平均查找长度

搜索成功
搜索失败


二分搜索有序表平均查找长度
可以画出具体的二叉搜索树来分析搜索成功的平均搜索次数和搜索失败的平均搜索次数

监视哨顺序搜索无序表及其平均查找长度
监视哨顺序搜索

平均查找长度

特殊情况,对于搜索概率不同的元素,按照搜索概率从高到低排序,可以得到较好的平均搜索长度

广义表
长度:广义表的元素或者子表的个数
深度:表中所有元素的的最大括号层数+1
表头:第一个元素
表尾:除第一个元素之外的元素组成的表
空表的表头表尾不存在
广义表节点定义
例子:
A()
B(a,b)
C(c,G)
D(B,C,A)
E(B,D)
F(h,F)
G(d,e,f)
























评论列表