题意:一颗二叉树,求  “  宽度  ”

思路:递归,貌似这个思路是对的,先记下,但是提交时超时,

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(二叉树,递归)的更多相关文章

  1. zoj 3805 Machine

    Machine Time Limit: 2 Seconds      Memory Limit: 65536 KB In a typical assembly line, machines are c ...

  2. Java - 二叉树递归与非递归

    树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...

  3. (二叉树 递归) 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 ...

  4. (二叉树 递归) 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 ...

  5. (二叉树 递归) 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 ...

  6. (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [1,null,2,3 ...

  7. JAVA二叉树递归构造、二叉树普通遍历及递归遍历

    二叉树类: package com.antis.tree; public class BinaryTree { int data; //根节点数据 BinaryTree left; //左子树 Bin ...

  8. 如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】

    [已知先序.中序求后序排列]--字符串类型 #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和 ...

  9. java 二叉树递归遍历算法

    //递归中序遍历 public void inorder() { System.out.print("binaryTree递归中序遍历:"); inorderTraverseRec ...

随机推荐

  1. mysql去掉空格换行符

    http://blog.csdn.net/gt219/article/details/52038382

  2. apache支持php

    #tarzxvf php-5.2.9.tar.gz #cdphp-5.2.9 #./configure--prefix=/usr/local/php --with-apxs2=/usr/local/a ...

  3. Oracle TNS路径

    修改tnsnames.oRA,监听文件   Oracle TNS路径 G:\Oracle\product\11.2.0\client_1\network\admin\tnsnames.oRA

  4. 1.1 合用weightSum属性和layout_weight属性

    <打造高质量Android应用:Android开发必知的50个诀窍>第1章活用布局,本章将介绍Android布局相关的一些窍门和建议.通过本章,读者不仅可以学习如何从零开始创建特定类型的布 ...

  5. PHP实现上次登录功能

    通过一个sql语句把上次的登录时间给本次登录时间,再把当前时间记录下来 update userinfo  set lasttime=userinfo.logintime,logintime= CURR ...

  6. Android 逐帧动画( Drawable 动画),这一篇就够了

    前言 作为 Android 最常见的两种动画形式,逐帧动画( Drawable 动画),有着极其广泛的应用,它的原理与早起的电影以及 GIF 类似,就是把一张的图,按顺序快速切换,这样一来看上去就好像 ...

  7. 在IDEA建立Maven的多模块Web项目

    由于要搭建的是Maven项目,考虑到后面可能会有扩展,因此项目搭建的分模块的. 下面一步一步的来搭建这个项目 打开IDEA集成开发环境,点击File ---> New ---> Proje ...

  8. 向oracle中插入date时,持久层sql怎么写???

    public class EmpDao { public void addEmp(Emp emp) throws SQLException { QueryRunner runner = new Que ...

  9. Docker入门系列6 如何打开多个终端进入Docker容器

    Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH.如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可.当我启动了五个容器后,每个容器默认是没有配置SS ...

  10. 再说WCF Data Contract KnownTypeAttribute

    WCF 中的序列化是用DataContractSerializer,所有被[DataContract]和[DataMemeber]标记的类和属性会被DataContractSerializer序列化. ...