2017-05-04 97 views
-1
class node 
{ 
    private float data; 
    private node left; 
    private node right; 

    public int TreeHeight(int depth) 
    {  
     root vL = left;//access to left data 
     root vR = right; 

     return depthOfTheTree; 
    } 
} 

樹看起來像這樣:http://imgur.com/EBS30rlBST高度算法

你好,我是做對返回樹的高度的一種方法算法。 該方法只能訪問左右節點。可變深度作爲參數已經爲方法本身賦值1(計算樹的根)。 我已經嘗試過遞歸調用方法,但結果並不接近預期。 我之前的代碼與下面的代碼類似。

public int TreeHeight(int depth) 
{ 
    if (left != null && right == null) 
     return left.TreeHeight(depth); 
    else if (left == null && right != null) 
     return right.TreeHeight(depth); 
    else 
     return left.TreeHeight(depth) + right.TreeHeight(depth); 
} 
+0

你應該格式化你的代碼。 – wayfare

+0

那麼我確實格式化了他的代碼,然後OP在格式化中倒退了。 OP,請正確格式化您的代碼,以便閱讀。 – Amy

+0

我現在做了@Amy –

回答

2

通過definition

節點的高度是節點和葉之間的最長路徑上的邊的數量。

對於BST它可以遞歸表示爲(僞碼):

height(node) = 
{ 
    0, when node == null 
    1 + max(height(node.left), height(node.right)), when node != null 
} 

因此遞歸方法不需要depth參數,並且可以是這樣的:

public int TreeHeight() 
{ 
    return 1 + Math.Max(
     left != null ? left.TreeHeight() : 0, 
     right != null ? right.TreeHeight() : 0 
    ); 
} 

和與C#6 null conditional operator,實施可能很簡單,因爲:

return 1 + Math.Max(left?.TreeHeight() ?? 0, right?.TreeHeight() ?? 0); 
+0

我發現很多與第二代碼相比較的例子,但是我必須在方法TreeHeight中使用數字深度作爲參數:\ –

+0

@MarkoŠkrilec:'但是我必須在方法TreeHeight中使用數字深度作爲參數。這個問題並沒有隱藏在對發佈的*問題的回答的評論中。如果您認識到編輯會使已發佈的答案無效,請不要更改問題:問問新問題。如果您確信舊問題或任何答案都無用,請將其刪除。 (你可以拿一個負分作爲暗示。) – greybeard