总结:
①线性结构:线性表、栈、队列、串、数组、广义表
②非线性结构:数(二叉树)
③哈弗曼树:带权路径长度最小的二叉树。带权路径长度WPL=所有叶子节点的权值*路径长度;
一、并查集
并查集支持查找一个元素所属的集合以及合并两个元素各自所属的集合等运算。
在这种数据类型中,n个不同的元素被分为若干组,每组是一个集合,这种集合叫做分离集合。
并查集的数据结构实现方法:数组、链表、数等。
用途:并查集求解等价问题。
二、拓扑排序
在一个有向图中找一个拓扑序列的过程称为拓扑排序。
拓扑排序方法如下:
①从有向图中选择一个没有前驱节点(入度为0)的顶点并且输出它。
②从图中删去该顶点,并且删去从该顶点出发的全部有向边。
③重复①②,直到图中不再存在没有前驱的顶点为止。
三、递归
总结:主要寻找递归出口和递归体。
定型用例:
1.定义递归
①阶乘
function fn(n){
if (n==1) {
return 1;
}else{
return n*fn(n-1);
}
}
②Fibonacci数列
function Fib(n){
if (n==1||n==2) {
return 1;
}else{
return Fib(n-1)+Fib(n-2);
}
}
②数据结构递归
如:求一个不带头节点的单链表L上的所有data域(假设为int型)之和。
function Node(x){
this.val=x;
this.next=null;
}
function constructL(arr){
if (arr.length==0) {
return null;
}else{
var L=new Node(arr[0]);
L.next=constructL(arr.slice(1));
return L;
}
}
function sum(L){
if (L==null) {
return 0;
}else{
return L.val+sum(L.next);
}
}
③问题的求解方法递归
Hanoi问题:设有3个分别命名为X,Y,Z的塔座,在塔座X上有n个直径各不相同,从小到大依次编号为1,2,...,n的盘片,现要求将X塔座上的n个盘片移到塔座Z上并仍按同样顺序叠放,盘片移动时必须遵守以下规则:
每次只能移动一个盘片;
盘片可以插在X,Y,X中任意塔座;
任何时候都不能将一个较大的盘片放在较小的盘片上。
思路:
1.利用串的基本运算写出对串求逆的递归算法。
思路:对于s="s1s2...sn"的串,假设"s2s3...sn"已经求出其逆串,再将s1连接到最后即得到s的逆串。
2.求顺序表{a1,a2,...,an}中最大元素。
思路:将线性表分解成{a1,a2,...,am}和{am+1,...,an}两个子表,分别求得子表中的最大元素ai和aj,比较ai和aj求最大值;再将每个子表分成两个子表进行上述操作...直到表中只有一个元素为止(当表中只有一个元素时,该元素便是该表的最大元素)。