计算二叉树中每个节点的子树大小的运行时间是多少

时间:2013-03-11 00:51:34

标签: algorithm binary-tree

当我进行二叉树练习时,我有一个让我困惑的问题:

给出一个带有n个节点的二叉树(通过指向它的根的指针)。设size(n)表示以节点n为根的子树中的节点数。计算树的每个节点n的大小(n)的必要和充足时间是多少?

有谁可以给​​我一些关于上述问题的提示?提前谢谢!

3 个答案:

答案 0 :(得分:3)

@ user1952500算法中存在一些错误:

  1. 在void函数内返回0
  2. 添加node-> num而不给出初始值
  3. 不遍历子节点以计算子树大小
  4. 因此固定版本将是:

    struct tree
    {
        int num;
        struct tree *l;
        struct tree *r;
    };
    
    void sizeofnode(tree *node)
    {
        if (node) { 
            node->num = 1; // Our size
    
            if (node->l) {
                sizeofnode(node->l);       // Calculates size of left subtree
                node->num += node->l->num; // Adds size of left subtree
            }
    
            if (node->r) {
                sizeofnode(node->r);       // Calculates size of right subtree
                node->num += node->r->num; // Adds size of right subtree
            }
        }
    }
    

答案 1 :(得分:1)

要获得以n为根的子树的大小,您必须以递归方式获取每个子树的大小。这实际上意味着您最终访问树的每个节点。

所以我相信时间的复杂性是O(n)。

答案 2 :(得分:0)

如果你可以有O(n)空间,那么你可以有一个O(n)解决方案:

这里'num'是O(n)空间的原因。

struct tree
{
    int num;
    struct tree *l;
    struct tree *r;
};

void sizeofnode(tree *node)
{
    if (!node) {
        return;
    }
    node->num = 0;

    if (node->l) {
        node->num += node->l->num; // size of left subtree
    }

    if (node->r) {
        node->num += node->r->num; // size of right subtree
    }

    node->num ++; // this is to add the size of the root of the subtree

    return;
}