【闲话】暑假第一期课马神讲过这题...当时应该还是认真听认真写了的 现在不难理解
1.n序遍历就是123中根在n的位置 剩余左右填(emmm可能就我看得懂吧/doge
2.字符串子串s.substr(n,p)是从s的第n位开始长度为p的子串(第一位为0)总理解错s1.substr(1,p),s2.substr(0,p)以为是1到p和0到p还奇怪为什么前序中序不一样长
3.注意-> node*&root
emmm关于悬挂指针存疑 网上的看不懂qwq
【题意】
二叉树是每个内部结点最多只有两个子结点且两个子结点有序的树。如下图就是一棵二叉树:1.前序遍历:先访问根结点,然后再前序遍历左子树,最后前序遍历右子树;
2.中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树;
3.后序遍历:先后序遍历左子树,然后后序遍历右子树,最后访问根结点。
对于上图,前序遍历的结果是ABDEHCFGI。中序遍历的结果是DBEHAFCIG,后序遍历的结果是DHEBFIGCA。
现在给出二叉树的前序和中序遍历,请输出相应的后序遍历。
【输入格式】
第一行前序遍历的结果
第二行中序遍历的结果
都是大写字母,且结点的标识不重复,最多只有100个结点。
【输出格式】
输出后序遍历的结果
【输入样例】
ABDEHCFGI
DBEHAFCIG
【输出样例】
DHEBFIGCA
【代码】
#include<iostream>
#include<string>
using namespace std;
struct node{
char data;
node *lch,*rch;
};
void create(string s1,string s2,node *&root){
if(s1==""){
root =NULL;
return;
}
root =new node;//root=new(node);
root->data =s1[0];
int len=s1.size() ,p;//字符串中第一个字符的索引为 0
p=s2.find(s1[0]);//从指定位置开始,并具有指定长度的子字符串
create(s1.substr(1,p) ,s2.substr(0,p),root->lch );
create(s1.substr(p+1,len-p-1),s2.substr(p+1,len-p-1),root->rch );
}
void lastord(node *root){//此处root不会改变函数外的root
if(root){
lastord(root->lch );
lastord(root->rch );
cout<<root->data ;
}
}
int main(){
string s1,s2;
node *root(NULL);//root 为空时悬挂指针?
cin>>s1>>s2;
create(s1,s2,root);
lastord(root);
cout<<endl;
return 0;
}