Algorithm 什么';s计算二叉树中每个节点的子树大小的运行时间
当我做二叉树练习时,有一个问题让我困惑: 给定一个具有n个节点的二叉树(通过指向其根的指针)。设size(n)表示以节点n为根的子树中的节点数。计算树的每个节点n的大小(n)的必要和充分时间是多少Algorithm 什么';s计算二叉树中每个节点的子树大小的运行时间,algorithm,binary-tree,Algorithm,Binary Tree,当我做二叉树练习时,有一个问题让我困惑: 给定一个具有n个节点的二叉树(通过指向其根的指针)。设size(n)表示以节点n为根的子树中的节点数。计算树的每个节点n的大小(n)的必要和充分时间是多少 有人能就上述问题给我一些提示吗?提前谢谢 若要获取以n为根的子树的大小,您必须递归地获取每个子树的大小。这本质上意味着您将访问树的每个节点 所以我相信时间竞争性是O(n)。要得到根在n的子树的大小,你们必须递归地得到每个子树的大小。这本质上意味着您将访问树的每个节点 所以我相信时间竞争性是O(n)。如
有人能就上述问题给我一些提示吗?提前谢谢 若要获取以n为根的子树的大小,您必须递归地获取每个子树的大小。这本质上意味着您将访问树的每个节点
所以我相信时间竞争性是O(n)。要得到根在n的子树的大小,你们必须递归地得到每个子树的大小。这本质上意味着您将访问树的每个节点 所以我相信时间竞争性是O(n)。如果你可以有O(n)空间,那么你可以有一个O(n)解: 这里的'num'是O(n)空间的原因 如果您可以拥有O(n)空间,那么您可以拥有O(n)解决方案: 这里的'num'是O(n)空间的原因
@user1952500算法中有几个错误:
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算法中有几个错误:
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是的,你是对的。我完全跳过了递归的美妙之处…谢谢!