习题6-3 UVa536 Tree Recovery(树的遍历转换)
2016-03-06 09:31
302 查看
题意:
给出先序和中序求后序
要点:
递归完成,只要注意一下边界就可以了,水题
这里有一种非常精妙的算法:
利用一个全局变量n=-1,我们会发现n的值每次++后在递归过程中正好与先序遍历的根节点相同,所以可以很简单的写出程序。
给出先序和中序求后序
要点:
递归完成,只要注意一下边界就可以了,水题
#include<stdio.h> #include<string.h> #include<stdlib.h> char s1[30], s2[30]; char tree[30]; int count; void build(int l1, int r1,int l2,int r2) { if (l1 > r1) return; //空树 int p = l2; while (s2[p] != s1[l1]) p++; build(l1+1, l1 + p-l2,l2,p-1); build(l1+p-l2+1,r1,p+1,r2); tree[count++] = s1[l1];//后序直接放后面就行了 } int main() { while (scanf("%s", s1) != EOF) { scanf("%s", s2); int len = strlen(s1); count = 0; build(0, len- 1, 0,len-1); for (int i = 0; i <count; i++) printf("%c", tree[i]); printf("\n"); } return 0; }
这里有一种非常精妙的算法:
利用一个全局变量n=-1,我们会发现n的值每次++后在递归过程中正好与先序遍历的根节点相同,所以可以很简单的写出程序。
#include<stdio.h> #include<stdlib.h> #include<string.h> char pre[100], in[100]; int n; void tranverse(int left,int right) { int i, temp; if (right <left) return; n++; //这里非常精妙,n作为根节点,按照先序遍历只要不断++即可 for (i = left; i <= right;i++) if (pre == in[i]) { temp = i; break; } tranverse(left, temp-1); tranverse(temp + 1, right); printf("%c",in[temp]);//这里输出pre 不正确,因为n是全局变量,比如本来n=2时输出因为递归n会改变 } int main() { while (scanf("%s%s", pre, in) != EOF) { int x = strlen(pre); n = -1; tranverse(0, x - 1); printf("\n"); } return 0; }
相关文章推荐
- Qt Mac 下软件Release 公布dmg
- Alert and Action sheets and Timer and Animation
- dijkstra单源最短路
- ggplot2_折线图
- HDU 1260 Tickets (DP)
- android px sp dp (-百度)(菜鸟新手)
- 循环链表任意位置输出
- 上机题目(初级)- 用数组实现记事本(Java)
- 47..贪心 失恋28天-追女孩篇
- 《机电传动控制》第二周作业
- 47..贪心 失恋28天-追女孩篇
- 47..贪心 失恋28天-追女孩篇
- 47..贪心 失恋28天-追女孩篇
- 47..贪心 失恋28天-追女孩篇
- 模拟登陆
- 算法练习-串的简单处理
- 二维数组的列排序
- UITableView
- android Butt 按钮单击事件的监听
- [视频]Win10 Mobile RedStone预览版磁贴动画演示:这就是淡入淡出