二叉树求调
  • 板块学术版
  • 楼主Milky_Cat
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/12 19:11
  • 上次更新2023/10/24 04:33:07
查看原帖
二叉树求调
906320
Milky_Cat楼主2023/1/12 19:11
#include<bits/stdc++.h>
using namespace std;
struct node{
	int depth;
	int left,right;
	int lr,scr;
};
int zx[50],xx[50],nodenum,root;
node tr[50];
bool cmp(int a,int b){
	if(tr[a].depth<tr[b].depth)return 1;
	if(tr[a].depth>tr[b].depth)return 0;
	if(tr[a].lr>tr[b].lr)return 1;
	return 0;
}
int build(int l,int r){
	if(l>=r)return -1;
	if(l==r)return l;
	int findroot=-1;
	for(int i=0;i<nodenum;i++)
		for(int j=l;j<=r;j++){
			if(xx[i]==zx[j]){
				findroot=j;
				break;
			}
		}
//	cout<<l<<' '<<r<<"   "<<findroot<<'\n';
	if(findroot!=-1)tr[findroot].left=build(l,findroot-1);
	if(findroot!=-1)tr[findroot].right=build(findroot+1,r);
	return zx[findroot];
}
void findepth(int nod,int depth){
	if(nod==-1)return;
	tr[nod].depth=depth;
	findepth(tr[nod].left,depth+1);
	findepth(tr[nod].right,depth+1);
}
void findlr(int nod,int lr){
	if(nod==-1)return;
	tr[nod].lr=lr;
	findlr(tr[nod].left,lr-1);
	findlr(tr[nod].right,lr+1);
}
void getscript(int nod){
	if(nod==-1)return;
	tr[nod].scr=nod;
	getscript(tr[nod].left);
	getscript(tr[nod].right);
}
void xxx(int nod){
	if(nod==-1)return;
	cout<<nod<<' ';
	xxx(tr[nod].left);
	xxx(tr[nod].right);
}
int main(){
	cin>>nodenum;
	for(int i=0;i<nodenum;i++)cin>>zx[i];
	for(int i=0;i<nodenum;i++)cin>>xx[i];
	build(0,nodenum-1);
	//cout<<"ooooo\n";
	findepth(xx[0],1);
	//cout<<"ooooo\n";
	findlr(xx[0],0);
	//cout<<"ooooo\n";
	//getscript(xx[0]);
	sort(xx,xx+nodenum,cmp);
	//xxx(xx[0]);
	//cout<<'\n';
	//for(int i=0;i<nodenum;i++){
	//	cout<<tr[xx[i]].depth<<' '<<tr[xx[i]].lr<<'\n';
	//}
	for(int i=0;i<nodenum;i++)cout<<xx[i]<<" ";
}

题目:给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

2023/1/12 19:11
加载中...