#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,a[19][2];
//保存镜像中序遍历
struct node{
int id,l,r,index,level;
};
vector<node> v1;
//还需要层序号
//序号之间没有代差是同层的简单易行(注意)
void dfs(int root,int index,int level)
{ //终止条件
if(a[root][1]!=-1)
dfs(a[root][1],2*index+2,level+1);
//整体条件是root
//v1是一个node(注意)
//入root而不是a[root],a[root]没有意义我们只需要他根节点的下标 (注意)
v1.push_back({root,0,0,index,level});
if(a[root][0]!=-1)
dfs(a[root][0],2*index+1,level+1);
}
//实现层序遍历
bool cmp(node a,node b)
{
if(a.level!=b.level) return a.level<b.level;
//镜像左右翻转以后新标号大号在前 因为是输出反转后的层序遍历
//注意cmp 不能写>=或<=
else return a.index>b.index;
}
int main()
{ int haven[100]={0};
cin>>n;
for(int j=0;j<n;j++)
{
string l,r;
cin>>l>>r;
if(l!="-") {
a[j][0]=stoi(l);
haven[stoi(l)]=1;
}
else a[j][0]=-1;
if(r!="-"){
a[j][1]=stoi(r);
haven[stoi(r)]=1;
}
else a[j][1]=-1;
}
int p=0;
//寻根
//出现 unquatified to 什么玩意 一般是括号不对 或者重名(注意)
while(haven[p]!=0) p++;
dfs(p,0,0);
//复制一个v1数组进行层序排列
//不是灵异事件是tm我傻了 node里面的变量id输出而不是node v整体输出 (注意)
vector<node>v2(v1);
sort(v2.begin(),v2.end(),cmp);
printf("%d",v2[0].id);
for(int i=1;i<v2.size();i++)
printf(" %d",v2[i].id);
printf("\n");
printf("%d",v1[0].id);
for(int i=1;i<v1.size();i++)
printf(" %d",v1[i].id);
return 0;
}
总结:
1. 自己定义了结构体,最后输出的是结构体里面的某个变量而不是整个节点,否则会出现灵异事件
2.出现 unquatified to 什么玩意 一般是括号不对 或者重名(注意)
3.注意cmp 不能写>=或<=,return 小于<最后是从小到大 return 大于是从大到小
4.dfs入的是传入参数的根root而不是结点中的什么,涉及到层号在dfs参数中也要体现出来,传入参数之间没有代差是同层的简单易行(注意) v1pushback就是将信息存入v1中
5.先写比较容易的条件,写完后再去想终止条件,先把大框写出来
英语:
问题: 1.层序遍历新思路加入层号参数 自定编号index(针对二叉树)直接sort
2.如果是一般的树invert呢