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\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(二叉树左右子树变换)相关推荐
- 第3关:递归实现二叉树左右子树交换
#include <iostream> #include "binary_tree.h"BiTreeNode* CreatBiTree(char* s, int &am ...
- 第4关:非递归实现二叉树左右子树交换
#include <iostream> #include "binary_tree.h"BiTreeNode* CreatBiTree(char* s, int &am ...
- 【整理自用】二叉树的子树、子结构
二叉树的子树和子结构 子树的意思是只要包含了一个结点,就得包含这个结点下的所有节点. 子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取. 简单而言,与子树不同的是,子结构可以是A树的 ...
- c++ 删除二叉树的子树_平衡二叉树
二叉树 二叉数是每个节点最多有两个子树,或者是空树(n=0),或者是由一个根节点及两个互不相交的,分别称为左子树和右子树的二叉树组成. 满二叉树 有两个非空子树(二叉树中的每个结点恰好有两个孩子结点切 ...
- c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...
点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...
- XDOJ-314-完全二叉树的子树
思路:递归解决 问题描述 对一棵完全二叉树,采用自上而下.自左往右的方式从1开始编号,我们已知这个二叉树的最后一个结点是n,现在的问题是结点m所在的子树一共包括多少个结点? 输入格式 输入数据包括多行 ...
- 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)
这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...
- 3003基于二叉链表的二叉树左右子树的交换
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为空) ...
- leetcode树之二叉树分裂子树
文章目录 1145.二叉树着色游戏 1339.分裂二叉树的最大乘积 1145.二叉树着色游戏 有两位极客玩家参与了一场「二叉树着色」的游戏.游戏中,给出二叉树的根节点 root,树上总共有 n 个节点 ...
最新文章
- android cpu调度策略_「性能优化3.0」Android线程调度异步方式汇总
- python3.8安装pygame_Python3.8安装Pygame教程步骤详解
- 每日干货丨C语言知识总结----循环结构
- Numbers on the Chessboard(CF-1027B)
- 一个交易号的生成和还原过程
- null value in entry: destinationDir=null
- 小程序和android毕设,微信小程序毕设论文(完整)
- 依码仕喷码机编程指南
- YUV420图像旋转
- r语言 svycoxph_基于R语言实现COX模型诊断
- mybatis源码之MapperMethod
- 关于canvas生成图片的方法
- 数据挖掘——基于R文本情感分析(2)
- 滤镜怎么调好看?分享给图片调色的教程
- 设备ssh连接失败问题
- vscode 状态栏图标异常问题
- 大学生书店网页设计制作 简单静态在线书店HTML网页作品 小说书籍网页作业成品 学生期末作业网站模板
- python进行音频转换
- 免费又好用的参考文献管理软件zotero该怎么使用?可以同时支持中文和英文吗?...
- python中seth是什么意思_python中的seth是什么意思
热门文章
- Linux Shell脚本专栏_一键查看服务器的利用率_04
- 将本地源代码程序推送远程Github仓库
- jmap+MAT实战内存溢出
- 系统机构设计师 - 软件质量属性
- 打印三角形流程控制练习
- redis 公网 安全_redis漏洞复现
- 柱状图中xy轴怎么出现_如果制砂机设备在工作中出现堵料现象该怎么办?
- bucket sort sample sort 并行_IBM布局AI硬件大杀器:硬软件并行开发、开源模拟AI工具包...
- java算法判断链表有没有闭环_前端算法系列之二:数据结构链表、双向链表、闭环链表、有序链表...
- C++中dynamic_cast的简介