遇见时光小米笔试-树的高度-java

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遇见时光小米笔试-树的高度-java相关的知识,希望对你有一定的参考价值。

技术分享

思路:类似于层次遍历,用队列实现。每层结点进队列,末尾加入-1;再出队列,同时添加结点的子节点入队列,遇到-1则深度加1;

java代码:

  1 package test;
  2 import java.util.ArrayList;
  3 import java.util.Iterator;
  4 import java.util.LinkedList;
  5 import java.util.Queue;
  6 import java.util.Scanner;
  7 class Node{
  8     
  9     public Node(int father, int child) {
 10         this.father = father;
 11         this.child = child;
 12     }
 13     int father;
 14     int child;
 15 }
 16 
 17 public class tree {
 18     /****
 19      * 层次遍历的思想,队列实现,按层添加到队列,末尾入队-1;
 20      */
 21     public static int deep(int n,ArrayList<Node> tree){
 22         int count=0;
 23         int j=0;//记录操作了多少个结点;
 24         if(n<=0){
 25             return 0;
 26         }else if(n==1){
 27             return 2;
 28         }else{
 29             Queue<Integer> queue=new LinkedList<Integer>();
 30             queue.offer(0);
 31             j++;
 32             queue.offer(-1);//
 33             boolean flag=false;//判断是否到尾结点;
 34             while(!queue.isEmpty()){
 35 //        printdata(queue);
 36                 Integer data=queue.poll();
 37 //                System.out.println();
 38 //                System.out.println("data:"+data);
 39 //                System.out.println();
 40                 if(j==n&&flag==false){
 41                     queue.offer(-1);
 42                     flag=true;
 43                 }else if(data==-1){    
 44                     if(flag){
 45                         count++;
 46                     }else{
 47                         queue.offer(-1);
 48                         count++;
 49                     }                    
 50                 }else{
 51                     for(int i = 0;i < tree.size(); i ++){
 52                         if(tree.get(i).father==data){
 53                             queue.offer(tree.get(i).child);
 54                             j++;
 55                         }
 56                     }                    
 57                 }
 58             }
 59             
 60         }
 61 
 62         return count;
 63     }
 64     public static void printdata(Queue<Integer> queue){
 65         for(Iterator it2 = queue.iterator();it2.hasNext();){
 66             System.out.println("Q:"+it2.next());
 67        }
 68     }
 69 
 70     public static void main(String[] args) {
 71         // TODO Auto-generated method stub
 72         Scanner in =new Scanner(System.in);
 73 //        while(in.hasNext()){
 74             int n=in.nextInt();
 75             ArrayList<Node> tree =new ArrayList<Node>();
 76             for(int i=0;i<n-1;i++){
 77                 int father=in.nextInt();
 78                 int child=in.nextInt();
 79                 Node node=new Node(father,child);
 80                 tree.add(node);            }
 81             System.out.println(deep(n,tree));
 82 //        }
 83     }
 84 
 85 }
 86 /**
 87  * 
 88  * 
 89 9
 90 0 1
 91 0 2
 92 1 3
 93 1 4
 94 2 5
 95 2 6
 96 3 7
 97 3 8
 98 
 99 5
100 0 1
101 0 2
102 1 3
103 1 4
104 **/

运行结果:

9
0 1
0 2
1 3
1 4
2 5
2 6
3 7
3 8
4

没有在赛码网ac过,大家可以试试。

 

以上是关于遇见时光小米笔试-树的高度-java的主要内容,如果未能解决你的问题,请参考以下文章

[遇见时光]java多线程中run和start方法

小米2017校招笔试题

JAVA小米集团-2021校招-算法方向在线考试(矩阵相乘+盒子包裹问题)

JAVA小米集团-2021校招-算法方向在线考试(矩阵相乘+盒子包裹问题)

毕业之后所有面试总结

[遇见时光]解决‘javac’不是内部或外部命令的问题