只给一个参考,没有反省,什么都做不到。对一个
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