今天学习了二叉树
#include<iostream>
#include<cstring>
using namespace std;
//s1 中序 s2 后序
void print(string s1,string s2)
{
if(s1=="\0"||s2=="\0")
return;
int pos=s1.find(s2[s2.size()-1]);
cout<<s1[pos];
print(s1.substr(0,pos),s2.substr(0,pos));
print(s1.substr(pos+1),s2.substr(pos,s2.size()-pos-1));
}
int main()
{
string s1,s2;
cin>>s1>>s2;
print(s1,s2);
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
//s1 先序 s2 中序
void print(string s1,string s2)
{
if(s1=="\0"||s2=="\0")
return;
int pos=s2.find(s1[0]);
print(s1.substr(1,pos),s2.substr(0,pos));
print(s1.substr(pos+1),s2.substr(pos+1));
cout<<s1[0];
}
int main()
{
string s1,s2;
cin>>s2>>s1;
print(s1,s2);
return 0;
}
这两道题都是同一类型的,都是已知先序或后序以及中序,求后序或先序。为了更方便的解决这两道题学习了find函数和substr函数。之后就可以根据先序中序后序的原理,利用递归推出未知的序列。
这道题目可以利用数组l,r储存二叉树的每个节点的左右孩子,再利用dfs不断更新最大深度。
#include<iostream>
using namespace std;
#define N 1000010
int l[N],r[N],n,ans;
void dfs(int x,int deep)
{
ans=max(ans,deep);
if(l[x]!=0)
{
dfs(l[x],deep+1);
}
if(r[x]!=0)
{
dfs(r[x],deep+1);
}
return;
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> l[i] >> r[i];
}
dfs(1,1);
cout <<ans<<endl;
return 0;
}