- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1) T的根结点为R,其类型与串S的类型相同; 2) 若串S的长度大于1,将串S从中间分开,分为等长的左
右子串S1和S2;由左子串S1构造R的左子树T1,由右子串 S2构造R的右子树T2。 现在给定一个长度为2N的“01”串,请用上述构造方法构 造出一棵FBI树,并输出它的后序遍历 序列。
20
if (n == 0)
return 1;
else
return n * F(n - 1);
}
12
栈
递归的实现是需要栈的,这里所使用的栈 是系统自带的栈
栈是一种数据结构,它符合先入后出的原 则
13
解决递归问题的关键
找出递推公式:即如何将问题划分为小规 模的问题
找到边界条件 NOTICE:由于函数中的局部变量是存在系
printf("%c",c);
/* 根节点输出。 */
}
19
FBI树
我们可以把由“0”和“1”组成的字符串分为三类:全“0” 串称为B串,全“1”串称为I串,既含“0”又含“1”的串则 称为F串。
FBI树是一种二叉树 ,它的结点类型也包括F结点,B结点 和I结点三种。由一个长度为2N的“01”串S可以构造出一棵 FBI树T,递归的构造方法如下:
6
第一讲:递归
7
什么是递归?
递归就是指一个函数直接或者间接地调用 自身。
问题的求解过程划分成相同性质的子问 题的求解,而小问题的求解过程可以很容 易的求出,这些子问题的解就构成里原问 题的解。
8
总体思想
待求解问题的解输入变量x的函数f(x) 通过寻找函数g( ),使得f(x) = g(f(x-1)) 且已知f(0)的值,就可以通过f(0)和g( )
FBI树
算法思想:本题为后序,类似于前一题,我们有相似的解 法
21
FBI树
int fbi(int i,int j)
{
if(i<=j){
int mid=(i+j)/2
if(i!=j){
fbi(i,mid);
fbi(mid+1,j);
}
int I,B;
while(i<=j)if(a[i++]=='0')B++;else I++;
统的栈上的,如果你的局部变量过大,如 较大的数组,将有可能栈溢出,这个时候 要考虑全局变量和人工栈的使用。
14
汉诺塔问题
现在有三根相邻的柱子,标号为A,B,C,A 柱子上从下到上按金字塔状叠放着n个不同 大小的圆盘,现在把所有盘子一个一个移 动到柱子B上,并且每次移动同一根柱子上 都不能出现大盘子在小盘子上方,请问至 少需要多少次移动,并输出步骤。
return ;
}
c=pre[pre_s];
/* c储存根节点。 */
k=find(c,in,in_s,in_e);
/* 在中序中找出根节点的位置。 */
pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /* 递归求解分割的左子树。 */
pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e); /* 递归求解分割的右子树。 */
if(B>0 && I>0)cout<<'F';
else if(B>0)cout<<'B';
else cout<<'I';
}
return 0;
}
22
第二讲:回溯
23
回溯
回溯是一种实现枚举的算法 其本质就是应用了递归这一工具所进行的
求出f(x)值
9
推广
扩展到多个输入变量x,y,z等,x-1也可以 推广到 x - x1,只要递归朝着“出口”的
方向即可
10
递归的三个要点
递归式:如何划分子问题 递归边界:递归的终止条件,也就是最小
的子问题 界函数:问题规模变化的函数,保证递归
向边界靠拢
11
求n!
#include <iostream.h> int F(int n) {
15
汉诺塔问题
void hanoi(int n,char A,char B,char C)
{
if(n==1)
{
printf("Move disk %d from %c to %c\n",n,A,C);
}
else
{
hanoi(n-1,A,C,B);
printf("Move disk %d from %c to %c\n",n,A,C);
第0讲:算法设计概论
时间复杂度 空间复杂度 调试方法与技巧
1
标题添加
点击此处输入相 关文本内容
前言
点击此处输入 相关文本内容
标题添加
点击此处输入相 关文本内容
点击此处输入 相关文本内容
2
时间复杂度
O(1)常数阶 O(log N)对数阶 O(N)线性阶 O(N^2)平方阶 O(N^3)立方阶 ……………………
3
空间复杂度
O(1)常数阶 O(log N)对数阶 O(N)线性阶 O(N^2)平方阶 O(N^3)立方阶 ……………………
4
调试方法与技巧
Break Point Watch Table Data Check Code
5
问题分析
分析题目的模型 考虑要用的算法 分析算法的时空复杂度 如果符合要求即可 Coding
hanoi(n-1,B,A,C);
}
}
16
前序中序求后序
树中已知先序和中序求后序。 如先序为:abdc,中序为:bdac . 则程序可以求出后序为:dbca 。
17
前序中序求后序
算法思想:先序遍历树的规则为中左右, 则说明第一个元素必为树的根节点,比如 上例中的a就为根节点,由于中序遍历为:左 中右,再根据根节点a,我们就可以知道, 左子树包含元素为:db,右子树包含元素: c,再把后序进行分解为db和c(根被消去 了),然后递归的进行左子树的求解(左 子树的中序为:db,后序为:db),递归 的进行右子树的求解(即右子树的中序为: c,后序为:c)。如此递归到没有左右子树 为止。
18
前序中序求后序
void pronum(char pre[],int pre_s,int pre_e,char in[],int in_s,int in_e)
{
char c;
int k;
if(in_s>in_e) return ;
/* 非法子树,完成。 */
if(in_s==in_e){printf("%c",in[in_s]); /* 子树子仅为一个节点时直接输出并完成。 */