我有這個代碼來找到二叉樹的直徑。 二叉樹的直徑:樹的直徑(有時稱爲寬度)是樹中兩棵樹葉之間最長路徑上的節點數。遞歸 - 二叉樹
我想了解下面的代碼和一般的遞歸。我試圖用這個簡單的樹幹運行。我明白什麼時候root的高度會變成1(Max(0,0)+1),然後返回Math.Max(0 + 0 + 1,Max(0,0))。我的理解是,它將根據此返回值將ldiameter設置爲1,而root = 10。這是正確的嗎?此時lh變爲1.它如何變爲1?另外,如果你可以幫助我幹一步一步地運行這個簡單的樹,這將是非常有用的。
10
/ \
20 30
public int FindDiameter_util(Node root, ref int height)
{
/* lh --> Height of left subtree
rh --> Height of right subtree */
int lh = 0, rh = 0;
/* ldiameter --> diameter of left subtree
rdiameter --> Diameter of right subtree */
int ldiameter = 0, rdiameter = 0;
if (root == null)
{
height = 0;
return 0; /* diameter is also 0 */
}
/* Get the heights of left and right subtrees in lh and rh
And store the returned values in ldiameter and ldiameter */
ldiameter = FindDiameter_util(root.left, ref lh);
rdiameter = FindDiameter_util(root.right, ref rh);
/* Height of current node is max of heights of left and
right subtrees plus 1*/
height = Math.Max(lh, rh) + 1;
return Math.Max(lh + rh + 1, Math.Max(ldiameter, rdiameter));
}
我給你的建議:第一,破除一切'ref's的。將其轉換爲一個方法,該方法返回一個由名稱爲Height和Diameter的兩個整數組成的不可變結構。其次,你必須有解釋變量名稱的意見,這意味着它們被命名得很糟糕。他們應該是'leftDiameter','leftHeight',等等。第三,編寫算法,以便每個變量只寫入一次。當你這樣做時,代碼將更容易理解。 –
你是對的,用裁判的是什麼讓我迷惑。感謝您的其他建議。 – Kar