一般树的高度

时间:2015-01-24 11:00:40

标签: c++ algorithm data-structures tree big-o

我在Tamassia和Goodrich的C ++(第2版)中进行数据结构和算法

我无法理解General Tree T的高度运行时间为O(n + sum_over_p(1 + dp))其中n是T的节点数,dp是节点p的深度(Page No 276)

这里使用的概念是“树的高度是外部节点的最大深度”

以下是查找书中给出的树高的代码

int height1(const Tree& T) {
    int h = 0;
    PositionList nodes = T.positions(); // list of all nodes
    for (Iterator q = nodes.begin(); q != nodes.end(); ++q) { 
        if (q−>isExternal())
            h = max(h, depth(T, *q)); // get max depth among leaves
    }
    return h;
}

谢谢!

更新

深度函数的代码是

int depth(const Tree& T, const Position& p) {
    if (p.isRoot())
        return 0; // root has depth 0
    else
        return 1 + depth(T, p.parent()); // 1 + (depth of parent)
}

2 个答案:

答案 0 :(得分:1)

我理解它的方式是迭代树中O(n)的所有节点。 对于每个外部节点,您调用depth函数,该函数取O(1 + dp)(因为对于深度为0的根节点,它需要1个函数调用,因此1 + dp),因此'原因sum_over_p(1 + dp)

唯一的问题是,在代码中,他们只为外部节点运行depth,而在定义中,似乎他们为每个节点调用它...所以我不知道在哪里'是的错误。

答案 1 :(得分:0)

想象一个完整的二叉树 T N 节点( N = 2 ^ K - 1 对于某些 K 因为 T 已满。 T 中有 N / 2 叶子,深度等于 K - 1 。对于这样的树,该算法将在 O(N log N)时间内运行(对于每个叶子,计算深度需要 O(K)。这真是糟糕知道这样一个简单的操作,如计算树高可以在 O(N)中完成。

我从未读过这本书,但我建议改变它。 Thomas H. Cormen的算法简介很适合介绍。