
树的高度
发布日期:2021-05-08 00:01:17
浏览次数:37
分类:精选文章
本文共 3199 字,大约阅读时间需要 10 分钟。
题目描述
现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度
输入描述:
输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成,下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号
输出描述:
输出树的高度,为一个整数
示例1
输入
复制
50 10 21 31 4
输出
复制
3
解题思路:
这是有个坑是题目要求为合法的二叉树,但输入数据是可以构成多叉树的,所以多余两个的子结构丢弃不用。
使map存储父结点和子结占的关系,然后从根结点进行遍历。
import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Scanner;import java.util.Set;public class Main { public static int height; public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); Map> map = new HashMap >(); Set child = new HashSet (); String line = ""; sc.nextLine(); while (sc.hasNextLine()) { line = sc.nextLine(); if (line.length() < 2) { break; } String[] items = line.split(" "); int key = Integer.parseInt(items[0]); int value = Integer.parseInt(items[1]); if (map.containsKey(key)) { if (map.get(key).size() < 2) { map.get(key).add(value); } } else { List list = new ArrayList (); list.add(value); map.put(key, list); } child.add(Integer.parseInt(items[0])); } int root = 0; for (Integer k : map.keySet()) { if (!child.contains(k)) { root = k; break; } } get(map, child, root, 0); System.out.println(height); } private static void get(Map > map, Set child, int root, int h) { // TODO Auto-generated method stub h++; if (map.get(root) == null) { if (h > height) { height = h; System.out.println("h: " + h + ", " + root); } } else { List list = map.get(root); for (Integer integer : list) { get(map, child, integer, h); } } }}
上面这个方法是个笨办法。
老干部使用了一种只记录结点所在深度的方法。但他的代码是在做平安笔试的时候写的,平安的题与这一题有点点区别。输入的时间没有第一行,也就是没有结点个数。而且老干部的解法没有考虑二叉树的合法验证。放在这里供自己学习。
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Scanner;public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); Listitems = new ArrayList (); Map m = new HashMap (); while(in.hasNextLine()) { items.add(new MM(in.nextInt(),in.nextInt())); in.nextLine(); } if(items.size()>0) { m.put(items.get(0).m, 0); m.put(items.get(0).n, 1); } int i = 0; while(items.size()!=0) { i = i %items.size(); if(m.containsKey(items.get(i).m) && !m.containsKey(items.get(i).n)) { m.put(items.get(i).n, m.get(items.get(i).m)+1); items.remove(i); continue; } if(!m.containsKey(items.get(i).m) && m.containsKey(items.get(i).n)) { m.put(items.get(i).m, m.get(items.get(i).n)-1); items.remove(i); continue; } if(m.containsKey(items.get(i).m) && m.containsKey(items.get(i).n)) { items.remove(i); continue; } i++; } Integer[] nn = new Integer[m.size()]; nn = m.values().toArray(nn); List ll = Arrays.asList(nn); Collections.sort(ll); int result = ll.get(ll.size()-1)-ll.get(0)+1; System.out.println(result); }}class MM { public int m; public int n; public MM(int m,int n) { this.m = m; this.n = n; }}
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月05日 09时32分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Head First设计模式——迭代器模式
2021-05-09
MongoDB版本及存储引擎区别
2021-05-09
shell echo单行和多行文字定向写入到文件中
2021-05-09
cmp命令
2021-05-09
Linux 磁盘管理(df fu fdisk mkfs mount)
2021-05-09
jQuery的事件绑定与触发 - 学习笔记
2021-05-09
Linux上TCP的几个内核参数调优
2021-05-09
记一次讲故事机器人的开发-我有故事,让机器人来读
2021-05-09
seo 回忆录百度基本概念(一)
2021-05-09
netcore中使用session
2021-05-09
Android 开发学习进程0.25 自定义控件
2021-05-09
多媒体文件格式全解说(下)--图片
2021-05-09
淘宝WAP版小BUG分析
2021-05-09
asp.net打印网页后自动关闭网页【无需插件】
2021-05-09
【Maven】POM基本概念
2021-05-09
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2021-05-09
【设计模式】单例模式
2021-05-09
远程触发Jenkins的Pipeline任务的并发问题处理
2021-05-09
entity framework core在独立类库下执行迁移操作
2021-05-09