我需要制作一个可以计算k树等级的函数。我这样写了:
Rank (T)
if T.child=NIL
return 0
else
return 1+ max{Rank(T.child), Rank(T.sibiling)}
end if
这是对的吗? max函数计算树的左节点数和右节点数之间的最大值。
答案 0 :(得分:0)
我不熟悉K树,所以如果我出错了,请纠正我。
如果我理解正确,则排名是小于您正在查找的根的节点数。因此,您需要平衡树,使得子节点的所有后续树都小于本地根。
之后,您需要对树进行有序遍历。您访问的第一个节点应该是最小的节点,并且给定等级0,访问的下一个节点应该被赋予等级1,依此类推。
示例代码:
private int getRank(Node<E> n, E target, int rank) {
if (n == null)
return rank;
rank = getRank(n.left, target, rank); // smaller nodes
if (n.e.equals(target)) // Solution to sought after node (target)
return rank;
System.out.println(n.e + " has rank " + rank);
return getRank(n.right, target, rank + 1); // larger nodes
}
public int getRank(E target) {
if (root != null) {
return getRank(root, target, 0);
}
return -1;
}
OUT:
3 has rank 0
4 has rank 1
5 has rank 2
7 has rank 3
9 has rank 4
另一种解决方案,如果树不平衡,则访问所有节点并计算小于目标节点的节点。
示例:
private int getRank(Node<E> n, E target, int count) {
if (n != null) {
for (Node<E> c : getChildren(n)) {
count += getRank(c, target, count);
}
if (n.e.compareTo(target) < 0) {
count++;
}
}
return count;
}