当我进行二叉树练习时,我有一个让我困惑的问题:
给出一个带有n个节点的二叉树(通过指向它的根的指针)。设size(n)表示以节点n为根的子树中的节点数。计算树的每个节点n的大小(n)的必要和充足时间是多少?
有谁可以给我一些关于上述问题的提示?提前谢谢!
答案 0 :(得分:3)
@ 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
}
}
}
答案 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;
}