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

题目的大致意思如下:

输入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;
    }
}

二.回溯法:待会补充

时间: 2024-10-28 16:38:34

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

输入6个人的成绩放入到一个一维数组中,然后打印出平均分,最后按成绩 从大到小打印。三个功能(输入是一个函数,求平均分是一个函数,排序是一个 函数)都用函数实现,最后在main方法中调用。

/*5.输入6个人的成绩放入到一个一维数组中,然后打印出平均分,最后按成绩从大到小打印.三个功能(输入是一个函数,求平均分是一个函数,排序是一个函数)都用函数实现,最后在main方法中调用.*/ #include <stdio.h> int inputScore(){ int score; scanf("%d",&score); return score;} double avg(int scores[],int length){ int i,score = 0;

20161116 输入两个自然数,求它们的和

题目: 输入两个自然数,求它们的和. 代码: 1 program work20161126; 2 var 3 a,b,c:integer; 4 BEGIN 5 readln(a,b); 6 c:=a+b; 7 writeln(c); 8 END.     

从键盘输入n个整数,求它们的最小公倍数

题目:从键盘输入n个整数,求它们的最小公倍数. 例如输入4,再输入2,4,6,8四个数求最小公倍数. 思路:从键盘输入4,将输入的字符串4转成int,再输入2,4,6,8,将输入的字符串用","分割开来,装入一个字符串数组, 如果数组的长度不等于之前得到的int,抛异常给Exception e,创建一个字符串数组,长度为4, 把字符串数组 里的元素装到int数组里,做一个for循环,拿i分别除数组里的每一个数,如果i能整除数组里的每一个数,i就是最 小公倍数. 代码如下: packag

invalid types &#39;int[int]&#39; for array subscript// EOF 输入多组数据//如何键盘输入EOF

数组维度搞错了 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止 while(scanf("%d %d",&a, &b) != EOF) // 输入结束时,scanf函数返回值为EOF(-1),即没有数据输入时会退出while循环 如何键盘输入EOF windows Ctrl+Z linux  Ctrl+d invalid types 'int[int]' for array subscript// EOF 输入多组数据//如何键盘输入EOF

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

1.HDU  1710  Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分左右子树,一直搜下去.感觉像dfs. 题意:二叉树,输入前.中序求后序. (1)建立出一颗二叉树,更直观.但那些指针用法并不是很懂. #include<iostream> #include<cstdio> #include<cstdlib> using namespace

企业发放奖金根据利润提成,从键盘输入当月利润I,求应发放奖金总数?

题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%:20万到40万之间时,高于20万元的部分,可提成5%:40万到60万之间时高于40万元的部分,可提成3%:60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 程序分析:请利用数轴来分界,定位. 程序源代码: #

//输入学生人数,挨个输入姓名,身高,年龄,求平均年龄,然后按身高降序排列输出

13:52:49N U L L 2014/12/19 13:52:49using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text; namespace _1120_1210{    class JieGouTi    {        //输入学生人数,挨个输入姓名,身高,年龄,求平均年龄,然后按身高降序排列输出        public s

输入10个人分数,求最高分,按分数从高到低排序&amp;&amp;去除最高分最低分,求平均分

1.输入10个人分数,求最高分,按分数从高到低排序 int[] arr = new int[10]; for (int i = 0; i < 10; i++)//arr.length=n { Console.Write("请输入第" + (i + 1) + "个人的分数:"); arr[i] = int.Parse(Console.ReadLine()); } for (int i = 0; i < 10; i++)//数组按索引一步步走,每走一步,就拿

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

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:首先最先想到的是遍历从1到n的每个数,判断每个数中包含1的个数,再相加. 时间复杂度:如果输入数字为n,n有O(logn)位,我们需要判断每个数字的每一位是不是为1,所以时间复杂度为O(n*logn).如果输入数字很大的时候,就需要大量的计算,效率不高. 接下来观察规律: 从个位到最高位,我们判断每一位1出现的次数.比如 对于数2