华科机考:二叉树遍历

时间限制:1秒                    空间限制:32768K

题目描述

二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

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

输出描述: 输入样例可能有多组,对于每组测试样例, 输出一行,为后序遍历的字符串。

输入例子: ABC

BAC

FDXEAG

XDEFAG

输出例子: BCA

XEDGAF

思路:1.通过前序序列找到根节点,然后以此节点为基础将中序序列分为两部分,大家平时这样的题也做过不少,现在是让用程序实现这一过程。

2.显然应该用递归实现这一过程,但实现递归,最重要的就是传参,这里我们设置4个参数,travel(char pre[],char inorder[],char post[],int length)

前三个分别对应前序,中序,后序序列,第四个则表示串长。

具体分析过程:

前序:FDXEAG

后序:XDEFAG

自己画了一下大致的过程:

大家可以看到以根节点为分界的点,无论是前序还是中序都分布在同一侧诶

具体实现的过程:

1. 先用一个for循环确定到根在中序序列中的位置,然后就可以对post数组进行赋值(将该值放置在post数组最后)

2.假设根的下标为i,则左串长度为i,pre数组的首地址为pre+1,inorder数组的首地址不需要移动,post数组的首地址不需要移动

即:travel(pre+1,inorder,post,i);

3.右串的长度为length-1-i,pre数组的首地址为pre+i+1,inorder数组的首地址位inorder+i+1,post数组的首地址为post+i;

4.当length<=0时,为递归出口

代码:

#include <iostream>
#include <string.h>
using namespace std;

void travel(char pre[],char inorder[],char post[],int length){
      if(length<=0)
        return;
      int i;
      for(i=0;i<length;i++)
         if(inorder[i]==pre[0])
            break;
      post[length-1]=pre[0];
      travel(pre+1,inorder,post,i);
      travel(pre+i+1,inorder+i+1,post+i,length-1-i);
}

int main(){
   char pre[30],inorder[30],post[30];
   while(cin>>pre){
   cin>>inorder;
   travel(pre,inorder,post,strlen(pre));
   //post[strlen(pre)]=‘\0‘;
   for(int i=0;i<strlen(pre);i++)
   cout<<post[i];
   cout<<endl;
   }
   return 0;
}

这里需要强调一下,这题如果要用cout或者printf()输出的话,需要在数组最后面加上‘\0‘,因为这题需要输入多组数组诶,当后来的串比前面要短时,就可能会发生错误。

时间: 2024-12-10 16:11:02

华科机考:二叉树遍历的相关文章

华科机考:字符串连接

输入描述: 每一行包括两个字符串,长度不超过100. 输出描述: 可能有多组测试数据,对于每组数据, 不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来. 输出连接后的字符串. 输入例子: abc def 输出例子: abcdef 要求:1.无冗余地接受两个字符串 2.无冗余的连接 显然像以前那样随便定义一个固定大小的数组是不行的(这是大一养成的恶习)o(╯□╰)o 当然用c++的string类,实现这两点非常简单. 代码: #include <iostream> u

华科机考:遍历链表

时间限制:1秒空间限制:32768K 题目描述 建立一个升序链表并遍历输出. 输入描述: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数. 输出描述: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出. 输入例子: 4 3 5 7 9 输出例子: 3 5 7 9 思路:这与以前直接建立链表不一样,在插入新节点时还需要重新遍历已有的节点,从而来判断插入的位置.具体实现的时候,加个头结点,方便插入操作.(大致过程类似于头插法)

华科机考:特殊排序

时间限制:1秒     空间限制:32768K 题目描述: 输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序. 输入描述: 输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数. 接下来的一行有N个整数. 输出描述: 可能有多组测试数据,对于每组数据, 第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序. 第二行将排序的结果输出. 输入例子: 4 1 3 4 2 输出例子: 4 1 2 3 这里要吐槽一下,只有一个数的时候需要输出-1诶,

华科机考:二叉排序树(改)

时间限制:1秒 空间限制:32768K 题目描述 二叉排序树,也称为二叉查找树.可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:  1.若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值: 2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值:3. 左.右子树本身也是一颗二叉排序树.  现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1. 输入描述: 输

华中尔科技大机试 二叉树遍历 Easy *两序列构建二叉树

基本思想: 要求用两个序列构建新的二叉树,标准写法,注意下: 关键点: 无: #include<stdio.h> #include<stdlib.h> #include<iostream> #include<string> #include<vector> #include<algorithm> #include<map> #include<set> using namespace std; string s1

华科机考:成绩排序

时间限制:1秒  空间限制:32768K 题目描述 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息. 输入描述: 测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据. 每个学生的数据包括姓名(长度不超过100的字符串).年龄(整形数).成绩(小于等于100的正数). 输出描述: 将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序. 然后输出

华科机考:统计单词

时间限制:1秒       空间限制:32768K 题目描述 编一个程序,读入用户输入的,以"."结尾的一行文字,统计一共有多少个单词,并分别输出每个单词含有多少个字符. (凡是以一个或多个空格隔开的部分就为一个单词) 输入描述: 输入包括1行字符串,以"."结束,字符串中包含多个单词,单词之间以一个或多个空格隔开. 输出描述: 可能有多组测试数据,对于每组数据, 输出字符串中每个单词包含的字母的个数. 输入例子: hello how are you. 输出例子:

华科机考:打印日期

时间限制:1秒       空间限制:32768K 题目描述 给出年分m和一年中的第n天,算出第n天是几月几号. 输入描述: 输入包括两个整数y(1<=y<=3000),n(1<=n<=366). 输出描述: 可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来. 输入例子: 2000 3 2000 31 2000 40 2000 60 2000 61 2001 60 输出例子: 2000-01-03 2000-01-31 2000-02-0

华科机考:排序

时间限制:1秒     空间限制:32768K 题目描述: 对输入的n个数进行排序并输出. 输入描述:     输入的第一行包括一个整数n(1<=n<=100).     接下来的一行包括n个整数. 输出描述:     可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格.     每组测试数据的结果占一行. 输入例子: 4 1 4 3 2 输出例子: 1 2 3 4 思路:排序嘛,不想用sort()的话,就谁便写一个冒泡算了 代码: #include <io