4

基本的に、再帰を使用してAVLツリーの最初の5ノードのみを出力したい

    void printInOrder(void* theTree, void(*printnode)(void *data)) {

        struct AVLTreeNode *node= (struct AVLTreeNode*)theTree;

        if (node == NULL) return;

         printInOrder(node->left, printnode);

        (printnode)(node->data);

        printInOrder(node->right, printnode);

     }

上記のコードは再帰的な inorder print です。ツリーの最初の 5 つのノードのみを出力するように変更したいと思います。ここにもprintnode関数があります

    void printnode(void *node){

        struct todo *printnode = node;

        printf("%s, %d\n", printnode->activity, printnode->priority);

    } 
4

1 に答える 1

2

いつ停止するかを関数に伝える必要があります。出力できるノードの数 (最初は 5) のカウンターを提供でき、1 つのノードが実際に出力されるたびに、カウンターをデクリメントします。

(または、カウンターをインクリメントすることもできますが、その場合、チェックには現在のカウンター値と最大カウンター値の 2 つの項があり、両方をパラメーターとして渡すか、それらをグローバル変数にする必要があります)。

印刷に加えて何かをする必要がある場合、またはより柔軟な

int printInOrder(void* theTree, int remaining, void(*printnode)(void *data))
{
    if (0 == remaining)
        return 0;
    struct AVLTreeNode *node= (struct AVLTreeNode*)theTree;
    if (node == NULL) return remaining;
    remaining = printInOrder(node->left, remaining, printnode);

    // When actually printing nodes, decrement counter
    (printnode)(node->data); remaining--;

    return printInOrder(node->right, remaining, printnode);
}

printInOrder(tree, 5, ...);

印刷に加えて何かをする必要がある場合、またはより柔軟な機能が必要な場合は、同じことを行うことができますが、パラメーターをに渡しますprintnode

void printInOrder(void* theTree, int remaining, int(*printnode)(int r, void *data))
{
    struct AVLTreeNode *node= (struct AVLTreeNode*)theTree;
    if (node == NULL) return remaining;
    printInOrder(node->left, remaining, printnode);
    remaining = (printnode)(remaining, node->data);
    printInOrder(node->right, remaining, printnode);
}

この 2 番目のケースではprintnode、カウンターを操作するprintInOrderだけで、渡すだけです。現在、printnodeノードごとに 1 回呼び出されますが、カウンターがゼロ以外の場合にのみ実際の印刷を行い、すべての場合に他のハウスキーピングを行うことができます。

于 2012-11-28T09:53:11.733 に答える