标签:遍历 arc like names def creat str format inpu
D
/
/
B E
/ \
/ \
A C G
/
/
F
Input
Output
Sample Input
DBACEGF ABCDEFG
BCAD CBAD
Sample Output
ACBFGED
CDAB
题意:给了二叉树的前序、中序,求后序
思路:
前序遍历:根-->左孩子-->右孩子
中序遍历:左孩子-->根-->右孩子
后序遍历:左孩子-->右孩子-->根
所谓的前中后指的是根的位置,而左右孩子顺序是不变的。
例如已知前序遍历是DBACEGF,中序遍历是ABCDEFG,那么由前序遍历先根,可知道D是树的根,再看在中序遍历中D左边是ABC,所以可知道ABC一定在D的左子树上,而EFG在D的右子树上。
那么前序遍历为BAC,中序遍历为ABC,所以B为根,在中序遍历中A在B的左边,C在B的右边,所以A为B的左孩子,C为B的有孩子。
以此类推递归下去。
递归找到,代码很简单,但是要明白怎么递归:
参考博客:http://www.cnblogs.com/-sunshine/archive/2012/07/24/2606341.html
学到一个新函数:
strchr:用来找s2中首次出现s1[0]的位置,返回位置指针,若不存在则返回NULL
1 #include<iostream>
2 #include<stdio.h>
3 #include<string.h>
4 using namespace std;
5
6 void print(int n,char *s1,char *s2,char *s)
7 {
8 if(n<=0)
9 return;
10 int x=strchr(s2,s1[0])-s2;
11 //strchr用来找s2中首次出现s1[0]的位置,返回位置指针,若不存在则返回NULL
12 print(x,s1+1,s2,s);//得到左子树
13 print(n-1-x,s1+x+1,s2+x+1,s+x);//得到右子树
14 s[n-1]=s1[0];//最后一个是根
15 }
16 int main()
17 {
18 char s1[30],s2[30],s3[30];
19 memset(s1,‘\0‘,sizeof(s1));
20 memset(s2,‘\0‘,sizeof(s2));
21 memset(s3,‘\0‘,sizeof(s3));
22 while(~scanf("%s %s",s1,s2))
23 {
24 print(strlen(s1),s1,s2,s3);
25 s3[strlen(s1)]=‘\0‘;//没有这个输出CDABGED不是CDAB
26 printf("%s\n",s3);
27 }
28 return 0;
29 }
标签:遍历 arc like names def creat str format inpu
原文地址:https://www.cnblogs.com/OFSHK/p/11305259.html