2013-10-03 9 views
7

バイナリツリーのサイズを見つけるために、このコードを見つけました。バイナリツリーのサイズメソッド

public int size() { 
    return(size(root)); 
} 
private int size(Node node) { 
    if (node == null) return(0); 
    else { 
    return(size(node.left) + 1 + size(node.right)); 
    } 
} 

二つの方法と引数なしの1があるように、それがなぜ私は混乱しています。私はそれがいくつかの良い習慣だと推測できるが、その理由を考えることができない。

答えて

4

OOPsは、あなたのビジネスロジックをプライベートメソッドで書くべきだと提案しています。私のビューサイズのメソッドはプライベートで、サイズをカウントするロジックはここにありますので、(クラスの外で) (継承を介して)。あなたはパブリック修飾子を持つこのサイズメソッドを返すために別のサイズを使用しています。他のユーザーは基本的にサイズを取得するためにそのクラスを使用します。

3

Nodeを受け取る方法は再帰的に実装されています。つまり、ツリーのサイズはNodeになります。これはバイナリツリークラス自体の外では役に立ちませんので、privateです。

他のsizeメソッドはツリー全体のサイズを検出し、呼び出し側はNodeを渡す必要はありません。バイナリツリーはそのルートが何であるかを既に知っています。再帰的ではありません。他のsizeメソッドに委譲し、rootを渡してツリー全体のサイズを取得します。これはクラスの外でとても役に立ちますので、publicです。

4

1はpublicであり、1つはprivateである。だから1つはパラメータpublic int size()なしで公開され、外部で使用され、もう1つは内部的に使用され、外部で隠されたprivate int size(Node)です。

この概念はカプセル化と呼ばれ、クラス(またはライブラリ)の使用を簡素化するための努力で、一般的な消費のために露出する必要はありません内部の詳細を隠す行為です。

1

も引数を持つ一つは、私が唯一の通常のコードは、彼らがために意図されているかを知るために、コメントを持つことができます

MyBinaryTree bt = new MyBinaryTree(); 
int treeSize = bt.size(); 

のようなものを使用することができることを意味し、プライベートです。場合によっては、クリーンなコードでもコメントは必要ありません。理論的には、バイナリツリー内の子を持つすべてのブランチもバイナリツリーとして扱うことができます。

Binary Tree sample

size()は、引数として、ルートノードを有する第2の1を呼び出すことに注意してくださいが、この場合には内部的になり、Aから始まるカウントを意味します。

Size of the tree is count of items from A 
Items from A are 1 + Items from B + Items from C 
Items from B are 1 
Items from C are 1 + Items from D + items from E 

なぜ、method with the same name and diferent argumentsを使用しますか?

これを行う理由としない理由はほとんどありません。通常は、何かを行う方法が複数あるか、デフォルトで何か他のものを使用したいということです。この場合、size()はデフォルトのルートとして使用されます。