【遇见时光】小米笔试-树的高度-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过,大家可以试试。

时间: 2024-11-12 14:42:26

【遇见时光】小米笔试-树的高度-java的相关文章

树的基本操作java版

看了一下树的定义,一些基本的操作,遍历,获取节点数,获取深度等等..这里参考了西电版的数据结构,基本用的都是递归实现的. 很多说明代码中都有,每个方法我都测了一下,这里我把节点类BTreeNode作为内部类放到了BTree中,方便一下.其实可以拿出来.还有我用的是二叉链表实现的树的存储,因为java 不能将函数(方法)作为参数传递,所以将visit()方法封装到了Visit类中,将Visit类对象作为参数传递 BTree.java 1 package com.gxf.tree; 2 3 /**

树的高度

题目: 有一颗树,不一定是二叉树,有n个节点,编号为0到n-1.有一个数组A,数组的索引为0到n-1,数组的值A[i]表示节点i的父节点的id,根节点的父节点id为-1.给定数组A,求得树的高度. 分析: 这个题目我们把数组写出来,然后分析,就很明了了.如下例子: 值 3 3 3 -1 2 index 0 1 2 3 4 根据题意: 节点0,1,2的父节点为3 节点3是根节点 节点4的父节点为2 解法: 一个直接的解法是,遍历数组A中的每一个元素,回溯到根节点,得到这个节点的高度.遍历完毕数组之

哈夫曼树(三)之 Java详解

前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树. 这

数据结构例程——以孩子兄弟链存储的树的高度

本文是数据结构基础系列(6):树和二叉树中第5课时树的存储结构的例程. 例: 以孩子-兄弟链作为存储结构,求树的高度 源程序:[说明--函数TreeCreate仅创建了如上图所示的图,不具有通用性.] #include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct tnode { ElemType data; //节点的值 struct tnode *hp; //指向兄弟 struct tno

树的高度,深度,层数和三种遍历方式

树的高度: 当只有一个根节点的时候,高度就是0. //计算树的高度int depth(Node node){ if(node == NULL) return -1; int l = depth(node->left); int r = depth(node->right); return (l < r)?(r+1):(l+1);//当只有一个根节点的时候,高度就是-1+1=0} 层数: 树的高度最底下的为第1层(有的书定义为第0层),依次向上累加 树的深度: 完全二叉树是指这样的二叉树:

树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:parent_id) 三.Java模型 (我们把这张网撒在html的一张表里.其实用ul来展示会简单N多,自己思考为什么LZ会选择放在表里) private class Table {        private Long id; // 当前对象的id         private int x; /

待字闺中之树的高度分析

有一个棵树,不一定是二叉树,有n个节点,编号为0到n-1.有一个数组A,数组的索引为0到n-1,数组的值A[i]表示节点i的父节点的id,根节点的父节点id为-1.给定数组A,求得树的高度. 分析这个题目我们首先把数组写出来,然后进一步分析,就很明了了,如下例子: 333-1201234根据题意: 节点0,1,2的父节点为3 节点3是根节点 节点4的父节点为2 一个很直接的解法是,遍历数组A中的每一个元素,回溯到根节点,得到这个节点的高度.遍历完毕数组之后,取最大的,就是树的高度.上面的例子大概

C#算法实现获取树的高度

我们知道,树类型作为数据结构中的重要一员,树的很多实现都是来自递归.本文想要实现的就是在桌面客户端项目开发中,经常用到的树结构(.Net平台下有个控件为TreeView).事实上,我们可能因业务需求自行定义一个树类型的数据结构. 接下来,首先给出我一开始用来获取树的深度的算法实现(存在欠缺) private int GetExportReportTemplateColumns(ReportTemplateTreeDTO reportTemplateTree, int reportTemplate

练习题二:树的高度

题目描述 现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度 输入描述: 输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成, 下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号. 输出描述: 输出树的高度,为一个整数 Python解法 # -*- coding:utf-8 -*-import sys def tree_height(root): if len(tree[root]) =