2013-10-03 10 views
7

İkili bir ağacın boyutunu bulmak için bu kodla karşılaştım.İkili ağaç için boyut yordamı

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

Neden kafam karışık, iki yöntem var ve tartışmasız bir tane var. Bunun iyi bir uygulama olduğunu ancak sebebini düşünemediğini tahmin edebilirim.

cevap

4

OOP'lar, iş mantığınızı özel yöntemle yazmanız gerektiğini önerir. Parametre ile görünüm boyutu yöntemime göre özeldir ve sayma boyutu için mantıklısınız, böylece başka hiçbiri (sınıf dışında) mantığınızı değiştiremez veya erişemez (miras yoluyla) .Bu boyut değiştiriciye sahip olan bu boyut yöntemini döndürmek için başka bir boyut kullanıyorsunuz ve diğer kullanıcı, boyutu almak için o sınıfı kullanacak, diğer kullanıcı boyutu nasıl hesapladığınızı bilmiyor.

3

Node numaralı size yöntemi, yinelemeli olarak uygulanmıştır - bu ağacın boyutunu Node aşağıdan bulur. Bu, ikili ağaç sınıfının dışında kullanışlı değil, yani private.

Diğer size yöntemi, tüm ağacın boyutunu bulur ve arayanlar Node; ikili ağaç zaten kökünün ne olduğunu bilir. Bu tekrarlayıcı değil. Tüm ağacın boyutunu elde etmek için root'u geçerek diğer size yöntemine temsil eder. Sınıfın dışında çok kullanışlı, yani public.

4

Biri public ve bir tanesi private. Yani biri public int size() parametresiz dışsal olarak maruz bırakılır ve kullanılır, diğeri ise yalnızca dahili olarak kullanılır ve harici olarak private int size(Node) gizlidir.

Bu kavram kapsülleme denilen ve sınıf (veya kitaplığın) kullanımını kolaylaştırmak amacıyla genel tüketim için maruz gerekmez iç ayrıntılarını gizleme eylemidir edilir.

1

Ve ayrıca bağımsız değişkenle biri ben sadece onlar içindir bilmek görüşleriniz de olabilir

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

Genellikle kod gibi bir şey kullanabilirsiniz anlamına gelir, özeldir. Bazen temiz bir kodun bile yorumlara ihtiyacı yoktur.

/** 
* Gets the size of the current binary tree. 
*/ 
public int size() { 
    return(size(root)); 
} 
/** 
* Gets the size of the given branch 
* @param node The branch to count from. 
*/ 
private int size(Node node) { 
    if (node == null) return(0); 
    else { 
    return(size(node.left) + 1 + size(node.right)); 
    } 
} 

Teoride, ikili ağaçtaki çocuklu tüm dallar da ikili ağaç olarak ele alınabilir. size() argüman olarak kök düğümü ile ikinci bir çağrı olacağı

Binary Tree sample

Not bu durumda içten öyle olacak, A'dan başlayarak sayısını ifade eder. Şimdi

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 

, neden method with the same name and diferent arguments kullanırsınız?

Bunu yapmanın ya da yapmamanın birkaç nedeni olabilir. Genellikle, bir şey yapmanın birden fazla yolu olduğu veya varsayılan olarak başka bir şey kullanmak istediğiniz anlamına gelir, bu durumda, size() varsayılan kök olarak kullanılır.