簡體   English   中英

如何使用遞歸函數僅打印樹的5個節點

[英]How to only print 5 node of a tree using a recursive function

所以基本上我只想使用遞歸打印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);

     }

上面的代碼是遞歸有序打印,我只想對其進行修改以僅打印出樹的前5個節點。 這也是printnode函數

    void printnode(void *node){

        struct todo *printnode = node;

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

    } 

您必須告訴該函數何時停止:您可以提供一個計數器,該計數器仍可打印多少個節點(最初為5個),並且每次實際打印一個節點時,您就遞減該計數器。

(或者,您可以增加計數器,但是在這種情況下,檢查有兩個條件-當前計數器值和最大計數器值-並且您需要將這兩個參數都作為參數傳遞,或者使它們成為全局變量)。

如果您需要執行除打印之外的其他操作,或者需要更靈活的方法

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

在第二種情況下,是printnode操縱計數器,而printInOrder只是傳遞計數器。 現在,每個節點都會調用一次printnode ,但是僅當counter非零時才執行實際打印,並且在所有情況下都可以執行其他任何內務處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM