二叉树

二叉树的遍历

点击查看代码
#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;
}
posted @ 2023-11-23 14:38  不o凡  阅读(8)  评论(0)    收藏  举报