2022.4.6(2)

洛谷p1827和p1030

本质上是同一问题。

/* 二叉树由前序遍历和中序遍历推导出后序遍历。
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
void p(string q,string z)
{
if(q.empty())
return;
char root=q[0];//前序遍历的第一个字母为当前的根节点
int k=z.find(root);//设中序遍历中中root的位置是k(从0开始数)
q.erase(q.begin());//删除前序遍历中的第一个字母,即根节点
string ql=q.substr(0,k);//前序遍历的0到k-1个字母为左子树
string zl=z.substr(0,k);//同上
string qr=q.substr(k);//第k到结尾为右子树
string zr=z.substr(k+1);//k为根节点,其右侧的字母为右子树
p(ql,zl);//后序遍历顺序为左-右-根
p(qr,zr);
cout<<root;//递归回来时输出每个叶子或根节点
}
int main()
{
std::ios::sync_with_stdio(false);
string z,q;
cin>>z>>q;
p(q,z);
cout<<"\n";
return 0;
}
*/
/* 二叉树由后序遍历和中序遍历推导出前序遍历
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
void p(string h,string z)
{
if(h.empty())
return;
char node=h[h.size()-1];
int k=z.find(node);
string hl=h.substr(0,k);
string zl=z.substr(0,k);
string hr=h.substr(k,h.size()-k-1);//剪切k之后一直到倒数第二个字母(即去除以输出的根节点)
string zr=z.substr(k+1);
cout<<node;
p(hl,zl);
p(hr,zr);
}
int main()
{
std::ios::sync_with_stdio(false);
string z,h;
cin>>z>>h;
p(h,z);
cout<<"\n";
return 0;
}
*/
/*此外,由前与后有时无法确定唯一的中序

但可以确定有几种,可以很容易的找出这类节点在前序后序中出现的规律。(前序中出现AB,后序中出现BA,则这个节点只有一个儿子)

每个这类节点有两种中序遍历(及儿子在左,儿子在右)根据乘法原理中序遍历数为 2^节点个数 种

/*
#include<cstdio>
#include<cstring>
using namespace std;
char str1[1001],str2[1001];
int sum=1;
int main()
{
scanf("%s%s",str1,str2);
for(int i=0;i<strlen(str1)-1;i++)//防止越界
{
for(int j=0;j<strlen(str2);j++)
{
if(str1[i]==str2[j]&&str1[i+1]==str2[j-1])
sum*=2;
}
}
printf("%d\n",sum);
return 0;
}
*/

posted @ 2022-04-06 16:49  noname5588  阅读(36)  评论(0)    收藏  举报