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

Posted 新竹六月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入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; } }

二.回溯法:待会补充

以上是关于输入N组父子对,求父子对所组成的二叉树的高度----17年某公司的笔试题的主要内容,如果未能解决你的问题,请参考以下文章

练习题二:树的高度

DS二叉树——二叉树之父子结点

DS二叉树--二叉树之父子结点

小米2017校招笔试题

树的高度

树的高度(并不需要建树,并不需要考虑谁是谁的孩子,因为输入保证了先父节点)