树的高度

题目描述

现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度

输入描述:

输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成,
下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号

输出描述:

输出树的高度,为一个整数

示例1

输入

复制

5
0 1
0 2
1 3
1 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<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
		Set<Integer> child = new HashSet<Integer>();
		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<Integer> list = new ArrayList<Integer>();
				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<Integer, List<Integer>> map, Set<Integer> 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<Integer> 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);
		List<MM> items = new ArrayList<MM>();
		Map<Integer, Integer> m = new HashMap<Integer, Integer>();
		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<Integer> 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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值