算法设计与分析个人总结(2020最新版)

更多学习资源,请关注本人个人微信公众号:

个人公众号:

我的微信号:                                      

一、贪婪算法

二、二分搜索算法

 

 

 

 

三、动态规划算法

3.1 DP0

 

 

 

3.2 DP1

 

 

3.3 DP2

 

 

 

3.4 DP3

 

 

四、深度优先搜索DFS

4.1 DFS0

 

 

 

 

4.2 DFS1

 

五、插入排序算法

 

 

六、回溯算法

 

 

 

 

七、递归算法

  •  

     

 

八、树

 

 

九、拓扑排序算法

十、快速排序算法

 

十一、归并排序算法

 

 

 

十二、冒泡排序算法

 

十三、高级数据结构

 

十四、树状数组

 

十五、线段树

 

十六前缀树

 

十七、优先队列

十八、树的遍历

18.1 前序遍历

 

对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子。以上图为例,递归的过程如下:

(1):输出 1,接着左孩子;

(2):输出 2,接着左孩子;

(3):输出 4,左孩子为空,再接着右孩子;

(4):输出 6,左孩子为空,再接着右孩子;

(5):输出 7,左右孩子都为空,此时 2 的左子树全部输出,2 的右子树为空,此时 1 的左子树全部输出,接着 1 的右子树;

(6):输出 3,接着左孩子;

(7):输出 5,左右孩子为空,此时 3 的左子树全部输出,3 的右子树为空,至此 1 的右子树全部输出,结束。

18.2 中序遍历

对于当前结点,先输出它的左孩子,然后输出该结点,最后输出它的右孩子。以上图为例:

(1):1-->2-->4,4 的左孩子为空,输出 4,接着右孩子;

(2):6 的左孩子为空,输出 6,接着右孩子;

(3):7 的左孩子为空,输出 7,右孩子也为空,此时 2 的左子树全部输出,输出 2,2 的右孩子为空,此时 1 的左子树全部输出,输出 1,接着 1 的右孩子;

(4):3-->5,5 左孩子为空,输出 5,右孩子也为空,此时 3 的左子树全部输出,而 3 的右孩子为空,至此 1 的右子树全部输出,结束。

 

18.3 后序遍历

对于当前结点,先输出它的左孩子,然后输出它的右孩子,最后输出该结点。依旧以上图为例:

(1):1->2->4->6->7,7 无左孩子,也无右孩子,输出 7,此时 6 无左孩子,而 6 的右子树也全部输出,输出 6,此时 4 无左子树,而 4 的右子树全部输出,输出 4,此时 2 的左子树全部输出,且 2 无右子树,输出 2,此时 1 的左子树全部输出,接着转向右子树;

(2):3->5,5 无左孩子,也无右孩子,输出 5,此时 3 的左子树全部输出,且 3 无右孩子,输出 3,此时 1 的右子树全部输出,输出 1,结束。

18.4 根据前序遍历中序遍历推导树的结构

已知:

前序遍历: GDAFEMHZ

中序遍历: ADEFGHMZ

求后序遍历

首先,要先画出这棵二叉树,怎么画呢?根据上面说的我们一步一步来……

1.先看前序遍历,前序遍历第一个一定是根节点,那么我们可以知道,这棵树的根节点是G,接着,我们看中序遍历中,根节点一定是在中间访问的,那么既然知道了G是根节点,则在中序遍历中找到G的位置,G的左边一定就是这棵树的左子树,G的右边就是这棵树的右子树了。

2.我们根据第一步的分析,大致应该知道左子树节点有:ADEF,右子树的节点有:HMZ。同时,这个也分别是左子树和右子树的中序遍历的序列。

3.在前序遍历遍历完根节点后,接着执行前序遍历左子树,注意,是前序遍历,什么意思?就是把左子树当成一棵独立的树,执行前序遍历,同样先访问左子树的根,由此可以得到,左子树的根是D,第2步我们已经知道左子树是ADEF了,那么在这一步得到左子树的根是D,请看第4步。

4.从第2步得到的中序遍历的节点序列中,找到D,发现D左边只有一个A,说明D的左子树只有一个叶子节点,D的右边呢?我们可以得到D的右子树有EF,再看前序遍历的序列,发现F在前,也就是说,F是先前序遍历访问的,则得到E是F的左子树,只有一个叶子节点。

5.到这里,我们可以得到这棵树的根节点和左子树的结构了。如下图:

6.接着看右子树,在第2步的右子树中序遍历序列中,右子树是HMZ三个节点,那么先看前序遍历的序列,先出现的是M,那么M就是右子树的根节点,刚好,HZ在M的左右,分别是它的左子树和右子树,因此,右子树的结构就出来了:

7.到这里,我们可以得到整棵树的结构:

18.5 根据树的中序遍历后序遍历推导树的结构

中序遍历:ADEFGHMZ

后序遍历:AEFDHZMG

1..根据后序遍历的特点(左右中),根节点在结尾,确定G是根节点。根据中序遍历的特点(左中右),确定ADEF组成左子树,HMZ组成右子树。

2.分析左子树。ADEF这四个元素在后序遍历(左右中)中的顺序是AEFD,在中序遍历(左中右)中的顺序是ADEF。根据后序遍历(左右中)的特点确定D是左子树的节点,根据中序遍历(左中右)的特点发现A在D前面,所以A是左子树的左叶子,EF则是左子树的右分枝。

EF在后序(左右中)和中序(左中右)的相对位置是一样的,所以EF关系是左右或者左中,排除左右关系(缺乏节点),所以EF关系是左中。

到此得出左子树的形状

3.分析右子树。HMZ这三个元素在中序遍历(左中右)的顺序是HMZ,在后序遍历(左右中)的顺序是HZM。根据后序遍历(左右中)的特点,M在尾部,即M是右子树的节点。再根据中序遍历(左中右)的特点,确定H(M的前面)是右子树的左叶子,Z(M的后面)是右子树的右叶子。

所以右子树的形状

  1. 最后得出整棵树的形状

 

十九、双端队列

 

 

二十、链表合并

 

二十一、链表

 

 

二十二、数组字符串

 

二十三、树的子结构

 

二十四、进制转换

十进制转二进制,我们采用短除法,比如要将十进制的29转成二进制,用29除以2,商写在下面,余数写在商的右边

继续往下除,同样的商写在下面,余数写在商的右边

当除到商为0的时候,就不用往下除了

这个时候将余数从下到商排列出来,得到的数就是二进制的

二进制转十进制采用权相加法,比如1011010转成十进制,需要说明下,2的几次方哪个次数是怎么确定的,比如从左数的第一位1,在它的前面还有六位,那么它的次数就是为6

十进制数怎么转换成16进制的数

直接除16,反向取余。如52转换成16进制。52/16=3……4,余数为4;接着3/16=0……3。所以转换的结果为34H。在比如把60536转换成16进制。60536/16=3783……8,3783/16=236……7,236/16=14……12,12对应16进制的C,14/16=0……14,14对应16进制的E,所以最终转换结果为EC78

十六进制转十进制:

16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……

所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。

例:2AF5换算成10进制:

用竖式计算:

第0位: 5 * 16^0 = 5

第1位: F * 16^1 = 240

第2位: A * 16^2= 2560

第3位: 2 * 16^3 = 8192

直接计算就是:

5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997

 

由于在二进制的表示方法中,每四位所表示的数的最大值对应16进制的15,即16进制每一位上最大值,所以,我们可以得出简便的转换方法,将16进制上每一位分别对应二进制上四位进行转换,即得所求:

例:2AF5换算成2进制:

第0位: (5)16 = (0101) 2

第1位: (F)16 = (1111) 2

第2位: (A) 16 = (1010) 2

第3位: (2) 16 = (0010) 2

得:(2AF5)16=(0010.1010.1111.0101)2

 

 

 

 

更多学习资源,请关注本人个人微信公众号:

个人公众号:

我的微信号:                                      

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/newlinfeng/article/details/106343405