2017-05-04 11 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; 
    } 
} 

ツリーはそのように見えます。 このメソッドは、左右のノードにのみアクセスできます。パラメータとしての変数の深さは、メソッド自体(ツリーのルートを数える)にすでに値1が付いています。 私は再帰呼び出しメソッドを試しましたが、結果は期待に近いものではありませんでした。 私の前のコードは以下のコードに似ています。BST高さのアルゴリズムは

definitionにより
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

ノードの高さは、そのノードとリーフの間最長パス上のエッジの数です。したがって

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

は、BSTの場合には(擬似コード)として再帰的に表すことができます。 C#6 null conditional operatorでは、その実装は次のように簡単です:

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

2番目のコードと比較してたくさんの例が見つかりましたが、メソッドTreeHeightのパラメータとして数値の深さを使用する必要があります:\ –

+0

@MarkoŠkrilec: 'メソッドTreeHeightのパラメータとして数値の深さを使用する必要があります。投稿された質問*への回答にコメントに隠されていない質問。編集が既に投稿された回答を無効にすることを認識した場合は、質問を変更しないでください:新しいものとして質問してください。あなたが古い質問も答えも役に立たないと確信しているなら、それを削除してください。 (あなたはヒントとして否定的なスコアを取るかもしれません。) – greybeard