|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
两个字符串,其长度n均小于等于26。第一行为前序遍历,第二行为中序遍历。二叉树中的结点名称以大写字母表示,最多26个结点。
对于每组测试样例,输出一行为后序遍历的字符串。
递归:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void getpost(char *, char *, char *, int, int, int, int, int, int);//由先序遍历和中序遍历得到后序遍历
- int main()
- {
- char pre[30] = {0}, in[30] = {0}, post[30] = {0};
- //pre,in,post分别记录前序遍历,中序遍历和后序遍历
-
- while(scanf("%s", pre) != EOF)
- {
- scanf("%s", in);
- int len = strlen(pre);
- getpost(pre, in, post, 0, len - 1, 0, len - 1, 0, len - 1);
- //参数:前、中、后序遍历,前、中、后序遍历记录数组的当前处理段的首尾
- printf("%s", post);
- printf("\n");
- }
- }
- void getpost(char pre[], char in[], char post[], int pre_start, int pre_end, int in_start, int in_end, int post_start, int post_end)
- {
- if(pre_start > pre_end)
- return;
- int i = 0;
- while(in[in_start + i] != pre[pre_start])//找到各个子树的中序遍历中的根
- i++;
- post[post_end] = pre[pre_start];
- getpost(pre, in, post, pre_start + 1, pre_start + i, in_start, in_start + i - 1, post_start, post_start + i - 1);//处理左子树
- getpost(pre, in, post, pre_start + i + 1, pre_end, in_start + i + 1, in_end, post_start + i, post_end - 1 );//处理右子树
- }
复制代码 画一棵树之后写出来先序中序后序遍历序列就很容易了
非递归方式得到后序遍历的方式想不太清楚没写出来,就放弃了
|
|