簡體   English   中英

此函數如何計算二叉樹中的節點數

[英]How does this function compute the number of nodes in binary tree

我有一個函數正在嘗試分析其輸出為7:

鑒於此代碼塊:

int func_1(struct node* node)
{
    if (node == NULL)
        return 0;
    else
        return func_1(node->left) + 1 + func_1(node->right);
}

這個二叉搜索樹: 在此處輸入圖片說明

返回值為7。

我知道遞歸,這里有點簡單,我嘗試跟進,但我不明白它是如何返回7的。我計算出它只是左移,左移,然后右移一次,僅此而已。 它將返回3。即使在根之后右移3次,它仍將返回6而不是7。

你們能幫我嗎?

從語義上講,它需要左節點數+ 1(當前節點)+右節點數。

與func_1(x)的意思是在該特定節點上調用該函數。

所以完整的計算是

  • func_1(8)+1 + func_1(14)
  • (func_1(7)+1 + func_1(9))+1 + func_1(14)
  • (1 +1 +1)+1(0 +1 + func_1(17)
  • 3 +1 +(0 +1 +(0 +1 + func_1(18))
  • 3 +1 +(1 +(1 +(0 +1 + 0))
  • 結果7

遞歸經常使用此原理:

  • 首先對“當前”項(當前節點)進行計算,在這種情況下,“節點本身”的節點數為1。
  • 而不是以遞歸的方式添加其他項的計算,在這種情況下,當前節點左邊的節點數和當前節點右邊的節點數。 出於排序原因,在這種情況下,當前節點的+1(節點數)位於中間。

看一下葉子節點7。

當使用節點7的值調用func_1 ,if語句將分支到else部分,因為指向該節點的指針有效。

然后, func_1將被調用兩次,一次是左孩子,一次是右孩子。 在這兩種情況下,函數都返回0,因為左,右子級均為NULL。 該函數將返回1:

return func_1(node->left) + 1 + func_1(node->right);

相當於:

return func_1(NULL) + 1 + func_1(NULL);

變成:

return 0 + 1 + 0;

看這句話

return func_1(node->left) + 1 + func_1(node->right);
                          ^^^^^

如果一個節點不等於NULL,它將對其自身進行計數,再加上相對於此節點的左右子樹中的節點數。

因此,您將獲得等於不等於NULL的節點數的結果。

暫無
暫無

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

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