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


     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 ", 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
    ", wide);
    52    }
    53    return 0;
    54 } 
  • 相关阅读:
    『Python』装饰器
    『Yaml』配置文件读写包
    『Python CoolBook』数据结构和算法_字典比较&字典和集合
    『TensorFlow』滑动平均
    在ASP.NET 5中如何方便的添加前端库
    使用VS把ASP.NET 5的应用发布到Linux的Docker上
    CQRS及.NET中的参考资料
    ASP.NET Identity 3.0教程
    对ASP.NET 5和ASP.NET MVC 6应用程序进行集成测试
    Bootstrap看厌了?试试Metro UI CSS吧
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3933889.html
Copyright © 2020-2023  润新知