悬一关注0pts
查看原帖
悬一关注0pts
1071829
ssssbbbbbb楼主2024/6/28 20:40

初学二叉写晕了求助

#include<bits/stdc++.h>
using namespace std;
const int maxn=26+10;
char s[maxn],z[maxn];
char root;
int xl,xr,zl,zr,zx[maxn],k,cnt;
struct node{
	int lc,rc,val;
}tree[maxn];
void dfs(int xl,int xr,int zl,int zr){//前序左子树,中序右子树 
	k++;
	tree[k].val=s[xl];//这个子树的根
	if(cnt==0){ //筛出没有左子树的,dfs右子树 
		tree[k].lc=0;		
		dfs(xl+1+cnt,xr,zl+cnt+1,zr);
	}else if(strlen(s)-cnt==0){//没有右子树 
		tree[k].rc=0;
		dfs(xl+1,xr+cnt,zl,zr+cnt-1);
	}else{//都有 
		dfs(xl+1,xr+cnt,zl,zr+cnt-1);
		dfs(xl+1+cnt,xr,zl+cnt+1,zr);
	}
}
void dfs2(char u){
	if(u==0) return ;
	dfs2(tree[u].lc);
	dfs2(tree[u].rc);
	cout<<u<<" ";
}
int main(){
	for(int i=1;i<=strlen(z);i++) cin>>z[i];
	cin>>s[1];root=s[1];
	zl=0;zr=0;//为了后面统计左子树个数将zr赋值为0 
	for(int i=2;i<=strlen(s);i++) cin>>s[i];
	 zr=strlen(z);
	for(int i=1;i<=strlen(s);i++){
		if(zr!=i-1) cnt++;//统计左子树个数 
		if(z[i]==root) zl=i+1;//中序中右子树起点 
	}
	/*for(int i=1;i<=cnt;i++){//记录左右子树 
		tree[i].lc=z[i];
		if(i+cnt+1<=s.size())
		tree[i].rc=z[i+cnt+1];
	}*/xl=2;xr=2+cnt-1;
	dfs(xl,xr,zl,zr);//递归,虽然不明白为什么一定要递归终起点 
	dfs2(root);
	for(int i=1;i<=strlen(s);i++) cout<<tree[i].val;
	return 0;
}
2024/6/28 20:40
加载中...