求后序遍历
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 4 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。
Input
输入有多组数据,对于输入每组数据有两行,第一行一个字符串(字符串长度不超过30),表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。
Output
对于每组输入输出仅一行,表示树的后序遍历序列。
Sample Input
abdec dbeac
Sample Output
debca
思路分析:涉及到二叉树的知识,先序的排列方式是先排根节点然后拍左节点然后拍右节点,中序是先排左节点然后拍根节点最后排右节点,后序为排左节点然后拍右节点然后排根节点;
代码#include<iostream> #include <stdio.h> #include <string> using namespace std; int i; int chazhao(string s1,char c)//在中序中查找 { for(i=0;i<s1.length();i++) if(c==s1[i]) return i; return -1; } bool bianli(string &str,string &mid) { if(str.length()==0)//如果先序没有 return false; if(str.length()==1)//如果先序为1就返回 { cout<<str; return true; } int k=chazhao(mid,str[0]);//找到根节点 string newstr=str.substr(1,k);//从先序的左边开始查找 string newmid=mid.substr(0,k);//从中序的左边开始查找 bianli(newstr,newmid);//找到新的根节点 newstr=str.substr(k+1,str.length()-k-1);//重复上面的从右边开始。 newmid=mid.substr(k+1,mid.length()-k-1); bianli(newstr,newmid); cout<<str[0]; } int main() { string str,mid; while(cin>>str>>mid) { bianli(str,mid); cout<<endl; } return 0; }: