题目的大致意思如下:

输入N组数,一组数代表一个父子对(如,0 1,0代表父节点,1代表子节点),求这N组数所组成的二叉树的高度;

例如:

输入:6

    0 1

    0 2

    1 3

    1 4

    2 5

    3 6

输出:4

解题思路:动态规划法,使用一个数组hight[N]记录每组数所能组成的二叉树的高度,初始化为全1数组,使用一个数组visited[N]来记录每组数的访问情况,找出最优子结构:

当visited[i]=0时,visited[i]=1,hight[i] = hight[i]+1;

然后,当matrix[j][0]=matrix[i][1]且visited[j]=0时,hight[j] = hight[i]+1,visited[j]=1;

代码如下:

import java.util.Scanner;

public class Main {

    /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int groups = scanner.nextInt();
int[][] matrix = new int[groups][2];for(int i=0;i<groups;i++){
for(int j=0;j<2;j++){
matrix[i][j] = scanner.nextInt();
}
}
        //动态规划输出处理
System.out.println(maxHightHelper(matrix));
        }
}//动态规划
public static int maxHightHelper(int[][] matrix){
if(matrix==null||matrix.length==0)
return 0;
//记录当前组的高度
int[] hight = new int[matrix.length];
for(int i=0;i<hight.length;i++)
hight[i] = 1;
byte[] visited = new byte[matrix.length];
for(int i=0;i<matrix.length;i++){
if(visited[i]==0){
visited[i] = 1;
hight[i] = hight[i]+1;
}
for(int j=i+1;j<matrix.length;j++){
if(matrix[j][0]==matrix[i][1]&&visited[j]==0){
visited[j] = 1;
hight[j] = hight[i] +1;
}
}
}
//找最大的高度
int max = 0;
for(int i=0;i<hight.length;i++){
if(max<hight[i])
max = hight[i];
}
return max;
}
}

输入N组父子对,求父子对所组成的二叉树的高度----17年某公司的笔试题的更多相关文章

  1. 求一个int型整数的两种递减数之和(华为2015笔试题及答案)

    给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同 ...

  2. ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)

    1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 136[Submit][Status ...

  3. HDU 1710 二叉树遍历,输入前、中序求后序

    1.HDU  1710  Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分 ...

  4. 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数

    题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:首先最先想到的是遍历从1到n的每 ...

  5. 牛客OJ——[编程题]A+B和C__如何输入多组测试数据(测试OK)

    几个要注意的地方: (1)Java OJ,必须将类名写成Main (2)关于如何输入多组测试数据,用二维数组去存储是一个方法,直接在while里面做也可以          但是如果  (3)关于整形 ...

  6. 从键盘输入当月利润I,求应发放奖金总数?

    企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%:20万到40万之间时 ...

  7. invalid types 'int[int]' for array subscript// EOF 输入多组数据//如何键盘输入EOF

    数组维度搞错了 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止 while(scanf("%d %d",&a, &b) != EOF) // 输入结束 ...

  8. 【C语言】输入一个整数N,求N以内的素数之和

    [C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...

  9. C/C++中输入多组数据方法

    --------开始-------- 对于刚开始学编程的人来说每次基本上就是一次数据输入,多次的话基本也是会给定一个数组的大小,但随着做刷算法题开始,题目有的会不直接告诉输入几组数据,基本输入都是多组 ...

随机推荐

  1. POJ2299逆序对模板(树状数组)

    题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...

  2. MFC信号量使用指南

    DEMO程序:TestSemaphore_DEMO.rar 源代码:TestSemaphore_SRC.rar ---关键代码如下--- void CTestSemaphoreDlg::OnBnCli ...

  3. Sql Server Report Service 的部署问题

    近期在研究SSRS部署问题,因为以前也用到过SSRS报表,但当时开发的报表是有专门的集成系统的,不需要我自己去部署,所以对这一块的部署也不熟悉,我记得当时我是直接开发出一个SSRS 报表,然后会通过自 ...

  4. Winfrom 实现转圈等待

    1.放弃进度条.动态进度图片等方式实现用户体验优化方式(主要是优化用户等待体验),建议使用方式? 答:对于From或者Control而言,其提供了Cursor属性设置即可. 例如: this.Curs ...

  5. vscode中使用Experimental Decorators报错

    在vscode中使用es7的新语法decorator会报错,如图: 这是错误来自与vscode的JS support,只要在项目根目录下创建一个jsconfig.json文件,添加如下内容: { &q ...

  6. xml dom minidom

    一. xml相关术语: 1.Document(文档): 对应一个xml文件 2.Declaration(声明): <?xml version="1.0" encoding=& ...

  7. R语言学习——数据分析

    complete.cases查看缺失值 箱图:

  8. python 可视化 二维坐标标注等等

     基本画图操作: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y1 = 2*x+1 y2 = ...

  9. 夜神模拟器+seleinm抓取手机app(参考资料集合)

    目前准备开始实现这个技术,将看起来还算可靠的参考链接粘贴如下: http://www.cnblogs.com/puresoul/p/4597211.html https://www.cnblogs.c ...

  10. 1038 Recover the Smallest Number (30 分)

    1038 Recover the Smallest Number (30 分) Given a collection of number segments, you are supposed to r ...