ZOJ 3805 Machine(二叉树,递归)
题意:一颗二叉树,求 “ 宽度 ”
思路:递归,貌似这个思路是对的,先记下,但是提交时超时,
1.如果当前节点只有左孩子,那么当前宽度等于左孩子宽度
2.如果当前节点只有右孩子,那么当前宽度等于右孩子宽度
3.如果当前节点既有左孩子又有孩子
3.1两个孩子宽度相等,则当前宽度等于其中一个孩子宽度+1
3.2两个孩子宽度不等,则当前宽度等于两个孩子宽度中大的那一个
代码1:超时
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int tree[10010][2];
int sum;
int dfs(int i){
if(tree[i][0]==0&&tree[i][1]==0) return 1;
if(tree[i][0]&&!tree[i][1]) return sum=dfs(tree[i][0]);//只有左孩子
if(!tree[i][0]&&tree[i][1]) return sum=dfs(tree[i][1]);//只有右孩子
else
if(dfs(tree[i][0])==dfs(tree[i][1])) return sum=dfs(tree[i][0])+1;//相等的时候,宽度为其中一个+1
else return sum=dfs(tree[i][0])>dfs(tree[i][1])?dfs(tree[i][0]):dfs(tree[i][1]);//不等的时候,宽度为大的
}
int main(){
int n;
int i;
int q;
while(~scanf("%d",&n)){
sum=0;
memset(tree,0,sizeof(tree));
for(i=2;i<=n;i++){
scanf("%d",&q);
if(tree[q][0]==0) tree[q][0]=i;
else tree[q][1]=i;
}
int ans=dfs(1);
printf("%d\n",ans);
}
return 0;
}
代码2:正确,代码1的超时原因是,在递归过程中,递归运算太多了,多了不少重复的运算
但是,以下正确代码更是蛋疼,有两个变量不能定义为全局变量,,,,啊啊啊啊啊,为啥啊,,,
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int tree[10010][2];
//int lsum,rsum;
int dfs(int i){
int lsum,rsum;//无语,,这俩变量定义为全局就不对,,求解脱
if(tree[i][0]==0&&tree[i][1]==0) return 1;
if(tree[i][0]&&!tree[i][1]){
// cout<<"1只有左孩子"<<endl;
return dfs(tree[i][0]);//只有左孩子
}
if(!tree[i][0]&&tree[i][1]){//此处代码不会运行,因为不存在只有右孩子的情况
// cout<<"2只有右孩子"<<endl;
return dfs(tree[i][1]);//只有右孩子
} lsum=dfs(tree[i][0]);
rsum=dfs(tree[i][1]);
//cout<<"lsum "<<lsum<<" rsum "<<rsum<<endl;
if(lsum==rsum) {
// cout<<"3左右孩子相等"<<endl;
// cout<<"lsum+1 "<<lsum+1<<endl;
return lsum+1;//相等的时候,宽度为其中一个+1
}
else {
// cout<<"4左右孩子不相等"<<endl;
return lsum>rsum?lsum:rsum;//不等的时候,宽度为大的
}
}
int main(){
int n;
int i;
int q;
while(~scanf("%d",&n)){
memset(tree,0,sizeof(tree));
for(i=2;i<=n;i++){
scanf("%d",&q);
if(tree[q][0]==0) tree[q][0]=i;
else tree[q][1]=i;
}
int ans=dfs(1);
printf("%d\n",ans);
}
return 0;
}
ZOJ 3805 Machine(二叉树,递归)的更多相关文章
- zoj 3805 Machine
Machine Time Limit: 2 Seconds Memory Limit: 65536 KB In a typical assembly line, machines are c ...
- Java - 二叉树递归与非递归
树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...
- (二叉树 递归) leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal
Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...
- (二叉树 递归) leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- (二叉树 递归) leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [1,null,2,3 ...
- JAVA二叉树递归构造、二叉树普通遍历及递归遍历
二叉树类: package com.antis.tree; public class BinaryTree { int data; //根节点数据 BinaryTree left; //左子树 Bin ...
- 如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】
[已知先序.中序求后序排列]--字符串类型 #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和 ...
- java 二叉树递归遍历算法
//递归中序遍历 public void inorder() { System.out.print("binaryTree递归中序遍历:"); inorderTraverseRec ...
随机推荐
- webstrom 代码工具(转http://www.cnblogs.com/tangdanni11/p/5149063.html)
Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...
- mixare的measureText方法在频繁调用时抛出“referencetable overflow max 1024”的解决方式
这几天在搞基于位置的AR应用,採用了github上两款开源项目: mixare android-argument-reality-framework 这两个项目实现机制大致同样.我选取的是androi ...
- eclipse学习
网上转载,以作以后学习之用! eclipse学习 关键字: eclipse学习 1 eclipse插件安装方法(link方法) 一般插件包含一个eclipse目录,其下是features和plugin ...
- SVN客户端忽略无关文件
修改前请先备份文件 ~/.subversion/config. 1,打开Terminal,输入命令: $ open ~/.subversion/config 2,在打开的文件中寻找:`global ...
- cacti 主机/网络设备流量监控 图解
1.在配置中找到设备 console —> Device 2.初次添加 cacti 监控主机的时候是没有任何设备的,所以要选择add 添加你要监控的主机 \
- 【Python基础】之函数、类和方法
一.函数 1. def定义函数 Python Shell: def add(a,b): return a+b >>>add(1,2) 3 def add(a=1,b=2): retu ...
- MySQL数据库的常见操作(七)
MySQL数据库的常见操作 1.创建数据库 2.创建重名的数据库以及如何查看警告信息 3.设置数据库的编码方式(默认为utf8) 4.修改和查看数据库的编码方式 5.删除数据库 6.6.删除已经删除了 ...
- 开源大数据引擎:Greenplum 数据库架构分析
Greenplum 数据库是最先进的分布式开源数据库技术,主要用来处理大规模的数据分析任务,包括数据仓库.商务智能(OLAP)和数据挖掘等.自2015年10月正式开源以来,受到国内外业内人士的广泛关注 ...
- VxWorks启动过程具体解释(下)
上一节主要是从映像的分类和各种映像的大致载入流程上看VxWorks的启动过程,这一节让我们从函数级看一下VxWorks的启动过程: 1. Boot Image + Loadable Images: 以 ...
- 三分钟教你学Git(十二) 之 fast-forward
什么是fast forward, 顾名思义,就是高速向前进,Git怎么做到高速的呢? 原来假设Git判定能够fast forward的时候,直接改动当前HEAD指针的指向然后再改动当前HEAD指针.说 ...