鱼C论坛

 找回密码
 立即注册
查看: 1044|回复: 0

[技术交流] 给定前序遍历和中序遍历求后序遍历

[复制链接]
发表于 2020-2-26 16:56:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
两个字符串,其长度n均小于等于26。第一行为前序遍历,第二行为中序遍历。二叉树中的结点名称以大写字母表示,最多26个结点。

对于每组测试样例,输出一行为后序遍历的字符串。

递归:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void getpost(char *, char *, char *, int, int, int, int, int, int);//由先序遍历和中序遍历得到后序遍历

  5. int main()
  6. {
  7.     char pre[30] = {0}, in[30] = {0}, post[30] = {0};
  8.     //pre,in,post分别记录前序遍历,中序遍历和后序遍历
  9.    
  10.     while(scanf("%s", pre) != EOF)
  11.     {
  12.         scanf("%s", in);
  13.         int len = strlen(pre);
  14.         getpost(pre, in, post, 0, len - 1, 0, len - 1, 0, len - 1);
  15.         //参数:前、中、后序遍历,前、中、后序遍历记录数组的当前处理段的首尾
  16.         printf("%s", post);
  17.         printf("\n");
  18.     }
  19. }

  20. 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)
  21. {
  22.     if(pre_start > pre_end)
  23.         return;
  24.     int i = 0;
  25.     while(in[in_start + i] != pre[pre_start])//找到各个子树的中序遍历中的根
  26.         i++;
  27.     post[post_end] = pre[pre_start];
  28.     getpost(pre, in, post, pre_start + 1,      pre_start + i, in_start,           in_start + i - 1, post_start,      post_start + i - 1);//处理左子树
  29.     getpost(pre, in, post, pre_start + i + 1, pre_end,       in_start + i + 1, in_end,           post_start + i, post_end - 1      );//处理右子树
  30. }
复制代码
画一棵树之后写出来先序中序后序遍历序列就很容易了

非递归方式得到后序遍历的方式想不太清楚没写出来,就放弃了



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表