java 中树_Java中树集的高度?

只给一个参考,没有反省,什么都做不到。对一个

TreeSet

实例t,您需要:

获得它的支持

NavigableMap

,默认情况下是

TreeMap

. 我们叫它M。

访问m的根,类型

TreeMap.Entry

使用简单的递归算法获取深度(max depth=height)和节点上的任何其他信息。

这似乎令人畏惧,但实际上要比看上去容易得多:

public class TreeSpy {

private static Object get(Object o, String fieldName) {

try {

Field declaredField = o.getClass().getDeclaredField(fieldName);

declaredField.setAccessible(true);

return declaredField.get(o);

} catch (Exception e) {

System.err.println("Could not gain access to field "

+ fieldName + " of " + o.getClass());

e.printStackTrace();

return null;

}

}

private static int diveInto(Object n, int depth, String indent) {

if (n == null) return depth-1; // we are empty, and should not be counted

Object left = get(n, "left");

Object right = get(n, "right");

String key = (String)get(n, "key");

int childrenCount = 0 + (left!=null?1:0) + (right!=null?1:0);

System.out.println(indent + key +

": depth=" + depth + ", chidren=" + childrenCount);

return Math.max(

diveInto(left, depth+1, indent+" "),

diveInto(right, depth+1, indent+" "));

}

public static void showDepthAndChildren(TreeSet set) {

TreeMap m = (TreeMap)get(set, "m");

Object root = get(m, "root");

int maxDepth = diveInto(root, 1, "");

System.out.println("Height = Max Depth = " + maxDepth);

}

public static void main(String ... args) {

TreeSet test = new TreeSet<>();

for (String s : "once upon a time in a galaxy far far away".split(" ")) {

test.add(s);

}

showDepthAndChildren(test);

}

}

注意,我们不能显式地提到节点的类型,因为

树映射条目

有私人通道。但是,我们仍然可以使用该类型的对象来检查属性。

我的机器(JDK8)的输出是:

once: depth=1, chidren=2

galaxy: depth=2, chidren=2

away: depth=3, chidren=2

a: depth=4, chidren=0

far: depth=4, chidren=0

in: depth=3, chidren=0

upon: depth=2, chidren=1

time: depth=3, chidren=0

Height = Max Depth = 5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值