簡體   English   中英

用節點左側所有值的總和替換樹的每個節點,而無需使用額外的整數指針參數

[英]replace each node of a tree with sum of all values in left side of the node without using extra integer pointer argument

給定一個二叉樹,我需要更改每個節點中的值,以將節點左側 所有節點中的所有值相加 本質上,每個節點的值都應等於按樹的順序遍歷此節點之前訪問的所有節點的所有值的總和。 重要的一點是,必須在不使用整數指針參數的情況下完成操作 我可以通過使用interger指針參數來解決它,以保持總和這樣。 如果沒有此整數指針變量,當我從其父節點訪問節點的右側時,如何持有sum。

void modifyBST(struct node *root, int *sum) {

    if (root == NULL)  return;

    // Recur for right subtree
    modifyBSTUtil(root->left, sum);

    // Now *sum has sum of nodes in right subtree, add
    // root->data to sum and update root->data
    *sum = *sum + root->data;
    root->data = *sum;

    // Recur for left subtree
    modifyBSTUtil(root->right, sum);
}

如何修改此方法,以便可以刪除int * sum 我的完整程序在這里點擊這里

示例樹:示例樹:順序:4 2 5 1 6 3 7預定:1 2 4 5 3 6 7輸出:4 6 11 12 18 21 28

int modify(struct node* node,int sum)
{
     if (node == NULL)
          return 0;

     int l=modify(node->left,sum);
     int r=modify(node->right,sum+l+node->data);

     int x=node->data;

     node->data=node->data+l+sum;

     return x+l+r;

}

使用語句調用該函數:

modify(root,0);

全面實施: http//ideone.com/A3ezlk

一種可能的解決方案:

換個問題,您真正想要做的是將每個節點的總和設置為上一個節點的總和+與該節點關聯的值,即

節點n- >和=節點n-1- >和+節點n- >值

現在,當您訪問節點n時,您正在設置節點n- > sum,但是遇到的問題是您無法輕松訪問節點n-1- > sum而不將其作為參數傳遞。 要解決此問題,我建議在確實可以訪問節點n-1- > sum時(即,當您訪問節點n-1時)設置節點n- > sum

一些C代碼來說明我的意思

void modifyBST(struct node *curNode)
{
    struct node* next = treeSuccessor(curNode);
    if(next != NULL)
    {
        next->sum = curNode->sum + next->value;
        modifyBST(next);
    }
}

假設在該節點調用ModifyBST之前已設置curNode->sum ,該節點對第一個節點有效(因為其總和剛好等於其值),並且對所有其他節點都有效。

您將通過找到第一個節點(示例中值為4的節點)來使用此方法,必要時將sum設置為等於其值,然后使用該節點作為參數調用ModifyBST。

TreeSuccessor是一個相當知名的算法,如果需要,您可以在許多地方在線找到它的偽代碼。

我認為下面的代碼應該可以正常工作。 我還沒有測試,只是手動檢查。

我希望這有幫助:

int modifyBST(struct node *root) {

    if (root == NULL)  return 0;

    root->data += modifyBSTUtil(root->left);

    return (root->data + modifyBSTUtil(root->right));
}

由於您的指針參數變量sum永遠不會改變,因此我們可以輕松擺脫它。

int sum;

void modifyNode(struct node *root)
{
    if (!root) return;

    modifyNode(root->left);
    sum = root->data += sum;
    modifyNode(root->right);
}

void modifyTree(struct node *root)
{
    sum = 0, modifyNode(root);
}

集成

暫無
暫無

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

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