二叉树的遍历
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=150;
int parent[N];
int child[N][2];
void dfs1(int u){
cout<<u<<' ';
if(child[u][0]) dfs1(child[u][0]);
if(child[u][1]) dfs1(child[u][1]);
}
void dfs2(int u){
if(child[u][0]) dfs2(child[u][0]);
cout<<u<<' ';
if(child[u][1]) dfs2(child[u][1]);
}
void dfs3(int u){
if(child[u][0]) dfs3(child[u][0]);
if(child[u][1]) dfs3(child[u][1]);
cout<<u<<' ';
}
int main(){
int n;
cin>>n;
int S;
cin>>S;
for(int i=1;i<n;i++){
int b,d;
char c;
cin>>b>>c>>d;
if(c=='L') child[b][0]=d;
else child[b][1]=d;
}
dfs1(S);
cout<<'\n';
dfs2(S);
cout<<'\n';
dfs3(S);
return 0;
}
问题 B: 二叉树重构
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
//先序 起点 终点 中序 起点 终点
void dfs(string first,int fl,int fr,string mid,int ml,int mr){
if(ml>mr) return;
int root=mid.find(first[fl]);
dfs(first,fl+1,fl+root-ml,mid,ml,root-1);
dfs(first,fl+root-ml+1,fr,mid,root+1,mr);
cout<<first[fl];
}
int main(){
cin>>s1>>s2;
int n=s1.length();
dfs(s1,0,n-1,s2,0,n-1);
return 0;
}
问题 C: 扩展二叉树
点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct node {
char val;
int l,r;
}pre[10010];
int p=-1,idx;
string s;
int dfs(){
int res;
if(s[++p]=='.') return 0;
res=++idx;
pre[res].val=s[p];
pre[res].l=dfs();
pre[res].r=dfs();
return res;
}
void dfs2(int u){
if(u==0) return ;
dfs2(pre[u].l);
cout<<pre[u].val;
dfs2(pre[u].r);
}
void dfs3(int u){
if(u==0) return ;
dfs3(pre[u].l);
dfs3(pre[u].r);
cout<<pre[u].val;
}
int main(){
cin>>s;
dfs();
dfs2(1);
cout<<'\n';
dfs3(1);
return 0;
}
问题 D: 数据结构-树-二叉树遍历
点击查看代码
#include<bits/stdc++.h>
using namespace std;
char s1[105],s2[105];
int mp[105];
void make_tree(int l,int r){//dfs序
if(l>r) return ;
int k=0x3f3f3f3f,where;
for(int i=l;i<=r;i++){//寻找根,一定是最小的编号
if(mp[s1[i]]<=k){
k=mp[s1[i]];
where=i;
}
}
putchar(s1[where]);
//左右子树
make_tree(l,where-1);
make_tree(where+1,r);
}
int main(){
gets(s1),gets(s2);
int len=strlen(s1);
for(int i=0;i<len;i++) mp[s2[i]]=i;//层次遍历编号
make_tree(0,len-1);
return 0;
}
问题 F: 数据结构-树-查找二叉树
点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct node {
int val;
int l,r;
}tree[10010];
int sum,ans,f[10010],mx;
void dfs(int u){
if(tree[u].val==ans) mx=u;
if(!u) return;
dfs(tree[u].l);
f[u]=++sum;
dfs(tree[u].r);
}
int main(){
int n;
cin>>n>>ans;
int id=0;
while(n--){
int x,l,r;
cin>>x>>l>>r;
tree[++id]={x,l,r};
}
dfs(1);
cout<<f[mx];
return 0;
}
问题 G: 数据结构-树-对称二叉树
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s;
int f,len;
void dfs(int u){
if(u>len) return;
if((u<<1)<=len&&(u<<1|1)>len||s[u<<1]=='#'&&s[u<<1|1]!='#'||s[u<<1]!='#'&&s[u<<1|1]=='#') {
f=1;
return;
}
dfs(u<<1);
dfs(u<<1|1);
}
int main(){
cin>>s;
len=s.length();
s=' '+s;
dfs(1);
cout<<(f?"No":"Yes");
return 0;
}
问题 H: 构造二叉树(完善程序)
点击查看代码
#include<iostream>
using namespace std;
const int maxn=10000;
int n;
int a[maxn];
int b[maxn];
int f(int l,int r,int depth){
if(l>r)
return 0;
int min=maxn,mink;
for(int i=l;i<=r;i++){
if(min>a[i]){
min=a[i];
mink=i;
}
}
int lres=f(l,mink-1,depth+1);
int rres=f(mink+1,r,depth+1);
return lres+rres+depth*b[mink];
}
int main( ){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
cout<<f(0,n-1,1)<<endl;
return 0;
}
问题 E: 数据结构-树-二叉树输出
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int f[1010];
//先序 起点 终点 中序 起点 终点
int dfs(string first,int fl,int fr,string mid,int ml,int mr){
if(ml==mr) return 1;
int root=mid.find(first[fl]);
int l=dfs(first,fl+1,fl+root-ml,mid,ml,root-1);
int r=dfs(first,fl+root-ml+1,fr,mid,root+1,mr);
f[fl]=l+r;
return f[fl];
}
int main(){
cin>>s1>>s2;
int n=s1.length();
dfs(s1,0,n-1,s2,0,n-1);
for(int i=0;i<n;i++){
if(!f[i]) cout<<s1[i];
else for(int j=1;j<=f[i];j++) cout<<s1[i];
cout<<'\n';
}
return 0;
}