k树的等级

时间:2018-06-14 11:31:54

标签: tree pseudocode

我需要制作一个可以计算k树等级的函数。我这样写了:

Rank (T)
if T.child=NIL
    return 0
else 
   return 1+ max{Rank(T.child), Rank(T.sibiling)}
end if 

这是对的吗? max函数计算树的左节点数和右节点数之间的最大值。

1 个答案:

答案 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;
}