ZOJ3805Machine(二叉树左右子树变换)

简介:

/*
    题意:建立一棵二叉树,左子树和父节点占一个宽度,右子树另外占一个宽度!
          使任意左右子树交换顺序,使得整个树的宽度最小!
    思路:递归交换左右子树 ! 
       开始写的代码复杂了,其实左右子树不用真的交换,只要返回交换与不交换最小的宽度值就好了,下次不用在查询了!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
using namespace std;

int tree[N][2];
int link[N];
int n;

int dfs(int cur){
   if(cur==0) return 0;
   int aR=1+dfs(tree[cur][1]);//右子树的宽度 
   int aL=dfs(tree[cur][0]);//左子树的宽度 
   return min(max(aR-1, aL+1), max(aR, aL));//aR-1是右子树变成左子树后的宽度,aL是左子树变成右子树的宽度 
}

int main(){
   while(scanf("%d", &n)!=EOF){
          memset(tree, 0, sizeof(tree));
          memset(link, 0, sizeof(link));
       for(int i=1; i<n; ++i){
          int u;
          scanf("%d", &u);
          if(link[u]==0){ 
              link[u]=1;
              tree[u][0]=i+1;
          } 
          else {
              tree[u][1]=i+1;
          }  
       }
       printf("%d\n", dfs(1));
   }
   return 0;
} 
//这个就是写复杂了,但是很庆幸的过了! 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
using namespace std;

int tree[N][2];
int link[N];
int n, wide;

int dfs(int cur){
   if(cur==0) return 0;
   int aR=1+dfs(tree[cur][1]);
   int aL=dfs(tree[cur][0]);
   return max(aL, aR);
}

void updateT(int cur){
    if(cur==0) return;
    updateT(tree[cur][0]);
    updateT(tree[cur][1]);
    int aL, aR;
    aL=dfs(tree[cur][0]);
    aR=1+dfs(tree[cur][1]);
    if(cur==1)  wide=min(max(aR-1, aL+1), max(aR, aL));
    if(aR-aL>1){
        int tmp=tree[cur][1];
        tree[cur][1]=tree[cur][0];
        tree[cur][0]=tmp;
    }
}

int main(){
   while(scanf("%d", &n)!=EOF){
          memset(tree, 0, sizeof(tree));
          memset(link, 0, sizeof(link));
       for(int i=1; i<n; ++i){
          int u;
          scanf("%d", &u);
          if(link[u]==0){ 
              link[u]=1;
              tree[u][0]=i+1;
          } 
          else {
              tree[u][1]=i+1;
          }  
       }
       updateT(1);
       printf("%d\n", wide);
   }
   return 0;
}

目录
相关文章
|
内存技术
STM32F103 五个时钟源
STM32F103 五个时钟源
902 0
申通快递单号查询api接口免费对接调用
申通物流轨迹查询-使用的物流单号和快递单号即可实现查询物流信息。 目前提供的快递查询接口有免费版和收费版,目前比较常用的是菜鸟和快递鸟接口。 快递鸟接口免费不限量对接 接口规则 (1)、查询接口支持按照运单号查询(单个查询,并发不超过10个/S)。
|
8月前
|
XML JSON API
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。
|
11月前
|
监控 Java API
基于trace_id实现SpringCloudGateway网关的链路追踪
通过上述步骤,我们可以在 Spring Cloud Gateway 中基于 `trace_id` 实现链路追踪。引入必要的依赖,配置 Zipkin,自动生成和传递 `trace_id`,并通过测试验证追踪功能。这种机制能够有效地帮助我们监控分布式系统中的请求流,快速定位问题和瓶颈。
752 13
|
Java API Spring
Springfox Swagger3从入门案例
本文通过一个简单的案例介绍了如何在Spring Boot项目中使用Springfox Swagger3来生成和配置API文档,包括添加依赖、创建配置类、编写控制器类以及访问Swagger UI界面。
379 0
Springfox Swagger3从入门案例
|
监控 安全 网络安全
如何使用PortTunnel端口映射工具?
【10月更文挑战第8天】PortTunnel是一种端口映射工具,它允许用户将本地计算机上的端口映射到远程服务器上。要使用PortTunnel,您需要首先下载并安装该软件,然后按照以下步骤进行操作:,1. 打开PortTunnel并配置您的本地和远程端口设置。,2. 在“本地地址”字段中输入您要映射的本地IP地址。,3. 在“远程地址”字段中输入远程服务器的IP地址。,4. 在“本地端口”字段中输入您要映射的本地端口号。,5. 在“远程端口”字段中输入远程服务器上的端口号。,6. 单击“启动”按钮以开始映射过程
1776 2
【Qt 学习笔记】Qt常用控件 | 显示类控件 | Calendar Widget的使用及说明
【Qt 学习笔记】Qt常用控件 | 显示类控件 | Calendar Widget的使用及说明
927 0
|
监控 安全 Linux
Linux C++ 环境下的FTP远程升级实现及异常处理策略
Linux C++ 环境下的FTP远程升级实现及异常处理策略
437 0
|
JavaScript
IDEA安装vue开发插件
IDEA安装vue开发插件
925 0
|
存储 SQL druid
​十分钟了解 Apache Druid
​十分钟了解 Apache Druid
1831 1