1 /*
 2     题意:建立一棵二叉树,左子树和父节点占一个宽度,右子树另外占一个宽度!
 3           使任意左右子树交换顺序,使得整个树的宽度最小!
 4     思路:递归交换左右子树 !        开始写的代码复杂了,其实左右子树不用真的交换,只要返回交换与不交换最小的宽度值就好了,下次不用在查询了!
 5 */
 6 #include<iostream>
 7 #include<cstdio>
 8 #include<cstring>
 9 #include<algorithm>
10 #define N 10005
11 using namespace std;
12
13 int tree[N][2];
14 int link[N];
15 int n;
16
17 int dfs(int cur){
18    if(cur==0) return 0;
19    int aR=1+dfs(tree[cur][1]);//右子树的宽度
20    int aL=dfs(tree[cur][0]);//左子树的宽度
21    return min(max(aR-1, aL+1), max(aR, aL));//aR-1是右子树变成左子树后的宽度,aL是左子树变成右子树的宽度
22 }
23
24 int main(){
25    while(scanf("%d", &n)!=EOF){
26           memset(tree, 0, sizeof(tree));
27           memset(link, 0, sizeof(link));
28        for(int i=1; i<n; ++i){
29           int u;
30           scanf("%d", &u);
31           if(link[u]==0){
32               link[u]=1;
33               tree[u][0]=i+1;
34           }
35           else {
36               tree[u][1]=i+1;
37           }
38        }
39        printf("%d\n", dfs(1));
40    }
41    return 0;
42 }
 1 //这个就是写复杂了,但是很庆幸的过了!
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define N 10005
 7 using namespace std;
 8
 9 int tree[N][2];
10 int link[N];
11 int n, wide;
12
13 int dfs(int cur){
14    if(cur==0) return 0;
15    int aR=1+dfs(tree[cur][1]);
16    int aL=dfs(tree[cur][0]);
17    return max(aL, aR);
18 }
19
20 void updateT(int cur){
21     if(cur==0) return;
22     updateT(tree[cur][0]);
23     updateT(tree[cur][1]);
24     int aL, aR;
25     aL=dfs(tree[cur][0]);
26     aR=1+dfs(tree[cur][1]);
27     if(cur==1)  wide=min(max(aR-1, aL+1), max(aR, aL));
28     if(aR-aL>1){
29         int tmp=tree[cur][1];
30         tree[cur][1]=tree[cur][0];
31         tree[cur][0]=tmp;
32     }
33 }
34
35 int main(){
36    while(scanf("%d", &n)!=EOF){
37           memset(tree, 0, sizeof(tree));
38           memset(link, 0, sizeof(link));
39        for(int i=1; i<n; ++i){
40           int u;
41           scanf("%d", &u);
42           if(link[u]==0){
43               link[u]=1;
44               tree[u][0]=i+1;
45           }
46           else {
47               tree[u][1]=i+1;
48           }
49        }
50        updateT(1);
51        printf("%d\n", wide);
52    }
53    return 0;
54 } 

转载于:https://www.cnblogs.com/hujunzheng/p/3933889.html

ZOJ3805Machine(二叉树左右子树变换)相关推荐

  1. 第3关:递归实现二叉树左右子树交换

    #include <iostream> #include "binary_tree.h"BiTreeNode* CreatBiTree(char* s, int &am ...

  2. 第4关:非递归实现二叉树左右子树交换

    #include <iostream> #include "binary_tree.h"BiTreeNode* CreatBiTree(char* s, int &am ...

  3. 【整理自用】二叉树的子树、子结构

    二叉树的子树和子结构 子树的意思是只要包含了一个结点,就得包含这个结点下的所有节点. 子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取. 简单而言,与子树不同的是,子结构可以是A树的 ...

  4. c++ 删除二叉树的子树_平衡二叉树

    二叉树 二叉数是每个节点最多有两个子树,或者是空树(n=0),或者是由一个根节点及两个互不相交的,分别称为左子树和右子树的二叉树组成. 满二叉树 有两个非空子树(二叉树中的每个结点恰好有两个孩子结点切 ...

  5. c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...

  6. XDOJ-314-完全二叉树的子树

    思路:递归解决 问题描述 对一棵完全二叉树,采用自上而下.自左往右的方式从1开始编号,我们已知这个二叉树的最后一个结点是n,现在的问题是结点m所在的子树一共包括多少个结点? 输入格式 输入数据包括多行 ...

  7. 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)

    这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...

  8. 3003基于二叉链表的二叉树左右子树的交换

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为空) ...

  9. leetcode树之二叉树分裂子树

    文章目录 1145.二叉树着色游戏 1339.分裂二叉树的最大乘积 1145.二叉树着色游戏 有两位极客玩家参与了一场「二叉树着色」的游戏.游戏中,给出二叉树的根节点 root,树上总共有 n 个节点 ...

最新文章

  1. android cpu调度策略_「性能优化3.0」Android线程调度异步方式汇总
  2. python3.8安装pygame_Python3.8安装Pygame教程步骤详解
  3. 每日干货丨C语言知识总结----循环结构
  4. Numbers on the Chessboard(CF-1027B)
  5. 一个交易号的生成和还原过程
  6. null value in entry: destinationDir=null
  7. 小程序和android毕设,微信小程序毕设论文(完整)
  8. 依码仕喷码机编程指南
  9. YUV420图像旋转
  10. r语言 svycoxph_基于R语言实现COX模型诊断
  11. mybatis源码之MapperMethod
  12. 关于canvas生成图片的方法
  13. 数据挖掘——基于R文本情感分析(2)
  14. 滤镜怎么调好看?分享给图片调色的教程
  15. 设备ssh连接失败问题
  16. vscode 状态栏图标异常问题
  17. 大学生书店网页设计制作 简单静态在线书店HTML网页作品 小说书籍网页作业成品 学生期末作业网站模板
  18. python进行音频转换
  19. 免费又好用的参考文献管理软件zotero该怎么使用?可以同时支持中文和英文吗?...
  20. python中seth是什么意思_python中的seth是什么意思

热门文章

  1. Linux Shell脚本专栏_一键查看服务器的利用率_04
  2. 将本地源代码程序推送远程Github仓库
  3. jmap+MAT实战内存溢出
  4. 系统机构设计师 - 软件质量属性
  5. 打印三角形流程控制练习
  6. redis 公网 安全_redis漏洞复现
  7. 柱状图中xy轴怎么出现_如果制砂机设备在工作中出现堵料现象该怎么办?
  8. bucket sort sample sort 并行_IBM布局AI硬件大杀器:硬软件并行开发、开源模拟AI工具包...
  9. java算法判断链表有没有闭环_前端算法系列之二:数据结构链表、双向链表、闭环链表、有序链表...
  10. C++中dynamic_cast的简介