计算任何树时间改进的节点

Counting the nodes of any tree time improvement

我必须创建一个函数来计算我的树有多少个元素。我的树不是二叉树,是最一般的那种树。

节点是:

typedef struct node{
char item;
int number_of_sons;
node **sons;
}

我的计数函数是这样的

void numbering(node *HT,int ok=0)
{
    static int number = 0;
    if (ok == 1)
    {
        printf("%d", number);
        return;
    }
    if (HT == NULL)
    {
        return;
    }
    else 
    {
        number++;
        for (int i = 0;i < HT->nr_of_sons;i++)
        {
            numbering(HT->next[i], 0);
        }
    }
}

有没有办法改进此功能以使其更快? 编辑:我使用这个函数的方式是:

int main()
{
//create tree;
 numbering(tree,0);
 numbering(tree,1);
}

当我第二次调用该函数时,它会打印我的结果

也许这样更好更高效:

int numbering(node *HT)
{
    if (!HT)
    {
        return 0;
    }

    int num = 1;
    for (int i = 0;i < HT->nr_of_sons;i++)
    {
        num += numbering(HT->next[i]);
    }
    return num;
}

我删除了您的 ok 变量并将 returned 值从 void 更改为 int。

  1. 以你为例 return 0;
  2. 为了叶子所以他们会 return 1;
  3. 对于内部节点,它们将 return 1 + 中的节点数 子树。

你有一个非常奇怪的递归函数——你在函数中使用了一个永远不会重置的静态变量,所以这个函数在每个程序中只能使用一次 运行!

我会这样重写:

size_t nodecount(node *root)
{
    size_t count = 0;
    if (root)
    {
        count++;
        for (int i = 0; i < root->nr_of_sons; i++)
        {
            count += nodecount(root->sons[i]);
        }
    }
    return count;
}

如果您真的想加快速度,可以通过添加一个 size_t subtree_count 字段来扩充节点结构,无论何时插入或删除节点,您都会维护该字段。另一个想法是直接将指向子数组的指针压缩到节点结构中:

typedef struct node{
    char item;
    int number_of_sons;
    node_t *sons[0];
} node_t;

我在这里所做的就是使 sons 变量成为一个数组而不是指向数组的指针。但它的大小为零(n.b。如果您的编译器需要,请使用 [][1]),因为您在编译时不知道子项的数量。但是您可以简单地分配适量的节点 space:

node_t* tree = (node_t*)malloc(sizeof(node_t) + num_sons*sizeof(node_t*));

这将指针间接减少了一层,这可能有助于提高性能。