Algorithm 什么';s计算二叉树中每个节点的子树大小的运行时间

Algorithm 什么';s计算二叉树中每个节点的子树大小的运行时间,algorithm,binary-tree,Algorithm,Binary Tree,当我做二叉树练习时,有一个问题让我困惑: 给定一个具有n个节点的二叉树(通过指向其根的指针)。设size(n)表示以节点n为根的子树中的节点数。计算树的每个节点n的大小(n)的必要和充分时间是多少 有人能就上述问题给我一些提示吗?提前谢谢 若要获取以n为根的子树的大小,您必须递归地获取每个子树的大小。这本质上意味着您将访问树的每个节点 所以我相信时间竞争性是O(n)。要得到根在n的子树的大小,你们必须递归地得到每个子树的大小。这本质上意味着您将访问树的每个节点 所以我相信时间竞争性是O(n)。如

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

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


有人能就上述问题给我一些提示吗?提前谢谢

若要获取以n为根的子树的大小,您必须递归地获取每个子树的大小。这本质上意味着您将访问树的每个节点


所以我相信时间竞争性是O(n)。

要得到根在n的子树的大小,你们必须递归地得到每个子树的大小。这本质上意味着您将访问树的每个节点

所以我相信时间竞争性是O(n)。

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

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

如果您可以拥有O(n)空间,那么您可以拥有O(n)解决方案:

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


@user1952500算法中有几个错误:

  • 在void函数中返回0
  • 添加到节点->num,但不提供初始值
  • 不遍历子节点以计算子树大小
  • 因此,固定版本应为:

    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
            }
        }
    }
    

    @user1952500算法中有几个错误:

  • 在void函数中返回0
  • 添加到节点->num,但不提供初始值
  • 不遍历子节点以计算子树大小
  • 因此,固定版本应为:

    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
            }
        }
    }
    

    你的想法是什么?@OliCharlesworth,嗨,对不起,我没有在帖子中包含我自己的想法……我认为为了计算节点子树的大小,我们可以迭代地这样做,我们继续从根遍历树,直到到达叶,我们加1并返回。这意味着每个节点将通过O(logn)时间到达,因为我们需要计算每个节点的子树,所以这就是O(nlogn)。我确信我的想法是否正确。你的想法是什么?@OliCharlesworth,嗨,对不起,我没有在帖子中包含我自己的想法…我认为为了计算节点子树的大小,我们可以迭代地这样做,我们继续从根遍历树,直到到达叶子,我们添加1并返回。这意味着每个节点将通过O(logn)时间到达,因为我们需要计算每个节点的子树,所以这就是O(nlogn)。我确信我的想法是否正确..嗨!获取根的子树大小是不够的,我认为问题在于获取每个节点的子树大小的运行时间。@DanQing:但正如smk所指出的,作为获取整棵树大小的一部分,您必须这样做。@OliCharlesworth,这是否意味着要获取树中每个节点的子树大小,我们真的需要O(n*n)时间吗?@DanQing:没有。因为为了得到子树A的大小,你必须已经找到子树A->左和子树A->右的大小。这适用于任何A,包括树的根。我们知道我们可以在O(n)中找到整棵树的大小。@OliCharlesworth是的,你是对的。我完全跳过了递归的美妙之处…谢谢!你好获取根的子树大小是不够的,我认为问题在于获取每个节点的子树大小的运行时间。@DanQing:但正如smk所指出的,作为获取整棵树大小的一部分,您必须这样做。@OliCharlesworth,这是否意味着要获取树中每个节点的子树大小,我们真的需要O(n*n)时间吗?@DanQing:没有。因为为了得到子树A的大小,你必须已经找到子树A->左和子树A->右的大小。这适用于任何A,包括树的根。我们知道我们可以在O(n)中找到整棵树的大小。@OliCharlesworth是的,你是对的。我完全跳过了递归的美妙之处…谢谢!