/*
题意:建立一棵二叉树,左子树和父节点占一个宽度,右子树另外占一个宽度!
使任意左右子树交换顺序,使得整个树的宽度最小!
思路:递归交换左右子树 !
开始写的代码复杂了,其实左右子树不用真的交换,只要返回交换与不交换最小的宽度值就好了,下次不用在查询了!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
using namespace std; int tree[N][];
int link[N];
int n; int dfs(int cur){
if(cur==) return ;
int aR=+dfs(tree[cur][]);//右子树的宽度
int aL=dfs(tree[cur][]);//左子树的宽度
return min(max(aR-, aL+), max(aR, aL));//aR-1是右子树变成左子树后的宽度,aL是左子树变成右子树的宽度
} int main(){
while(scanf("%d", &n)!=EOF){
memset(tree, , sizeof(tree));
memset(link, , sizeof(link));
for(int i=; i<n; ++i){
int u;
scanf("%d", &u);
if(link[u]==){
link[u]=;
tree[u][]=i+;
}
else {
tree[u][]=i+;
}
}
printf("%d\n", dfs());
}
return ;
}
 //这个就是写复杂了,但是很庆幸的过了!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
using namespace std; int tree[N][];
int link[N];
int n, wide; int dfs(int cur){
if(cur==) return ;
int aR=+dfs(tree[cur][]);
int aL=dfs(tree[cur][]);
return max(aL, aR);
} void updateT(int cur){
if(cur==) return;
updateT(tree[cur][]);
updateT(tree[cur][]);
int aL, aR;
aL=dfs(tree[cur][]);
aR=+dfs(tree[cur][]);
if(cur==) wide=min(max(aR-, aL+), max(aR, aL));
if(aR-aL>){
int tmp=tree[cur][];
tree[cur][]=tree[cur][];
tree[cur][]=tmp;
}
} int main(){
while(scanf("%d", &n)!=EOF){
memset(tree, , sizeof(tree));
memset(link, , sizeof(link));
for(int i=; i<n; ++i){
int u;
scanf("%d", &u);
if(link[u]==){
link[u]=;
tree[u][]=i+;
}
else {
tree[u][]=i+;
}
}
updateT();
printf("%d\n", wide);
}
return ;
}

ZOJ3805Machine(二叉树左右子树变换)的更多相关文章

  1. 剑指OFFER18 判断一个二叉树的子树

    public class a18_IsSubTree { public static boolean hasSubTree(TreeNode treeRoot1, TreeNode treeRoot2 ...

  2. 剑指Offer:面试题19——二叉树的镜像(java实现)

    问题描述: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树结点定义为: public class TreeNode { int val = 0; TreeNode left = null; Tr ...

  3. 我要好offer之 二叉树大总结

    一. 二叉树定义 二叉树具有天然的递归特性,凡是二叉树相关题,首先应该联想到递归 struct BinTreeNode { BinTreeNode* left; BinTreeNode* right; ...

  4. 轻松搞定面试中的二叉树题目(java&python)

    树是一种比较重要的数据结构,尤其是二叉树.二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒.二叉 ...

  5. php二叉树算法

    二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2^{i-1}个结点:深度为k的二叉树至多有2^k-1个结点:对任何一棵二叉树T,如 ...

  6. Data Structure 之 二叉树

          在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用于实现二叉查找树和二叉堆 ...

  7. 二叉树-你必须要懂!(二叉树相关算法实现-iOS)

    这几天详细了解了下二叉树的相关算法,原因是看了唐boy的一篇博客(你会翻转二叉树吗?),还有一篇关于百度的校园招聘面试经历,深刻体会到二叉树的重要性.于是乎,从网上收集并整理了一些关于二叉树的资料,及 ...

  8. js 实现二叉树

    二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree),右边的总是大于左边的!二叉树的每个结点至多只有二棵子树(不存 ...

  9. ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)

    二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是 ...

随机推荐

  1. angularjs 表单验证(不完整版)

    针对项目实践表单验证总结: angular 的 form表单验证:form内需要novalidate取消默认验证,用ng自己的验证,form的名字是非常必要的 栗子:以注册为栗子,下面是注册的部分: ...

  2. Ajax的同步与异步

    原文地址:http://www.cnblogs.com/Joetao/articles/3525007.html <%@ Page Language="C#" AutoEve ...

  3. .Net mvc 后台传单引号错误&#39

    今天调试半天程序 结果出现JS 无法eval() 网上找个半天解决办法无果 最后 是因为后台输出单引号’ 到前台为&#39 解决办法 给一个隐藏文本框或者标签赋值 再取出来就能显示单引号了

  4. apache httpclient CacheStorage的一个自定义实现

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  5. WPF快速入门系列(7)——深入解析WPF模板

    一.引言 模板从字面意思理解是“具有一定规格的样板".在现实生活中,砖块都是方方正正的,那是因为制作砖块的模板是方方正正的,如果我们使模板为圆形的话,则制作出来的砖块就是圆形的,此时我们并不 ...

  6. 自己写一个java.lang.reflect.Proxy代理的实现

    前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...

  7. Java设计模式3:工厂方法模式

    工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...

  8. angularjs之browserTrigger

    今天推荐一款来自angularjs源码的单元测试辅助库browserTrigger,这是来自于ngScenario的一段代码.主要用户触发浏览器型行为更新ng中scope view model的值. ...

  9. java提高篇(二四)-----HashSet

          在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素. ...

  10. Handlebars.js循环中索引(@index)使用技巧(访问父级索引)

    使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循 ...