pat-1102

该篇博客介绍了如何通过自定义结构体和深度优先搜索(DFS)实现二叉树的镜像中序遍历,并利用层序遍历的层号参数进行排序。此外,还提到了在一般树结构中进行类似操作的思考。博客强调了在编写代码时注意终止条件、结构体变量使用以及比较函数的细节。
摘要由CSDN通过智能技术生成
#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呢

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值