2016-03-26 13 views
1

C ile uzun bir süre sonra Java'ya dönüyorum ve basit bir konsepte yakalandım. Yataklarımı geri almak için temel bir BST uygulaması yazmaya başladım ve Java'nın katma değerli parametre geçişini anladığımı düşündüm (evet, nesne referanslarının bile, çok yaygın bir yanlış anlamadan geçtiğini anlıyorum).bst implementaion'dan geçen Java parametresi

Ekleme işlevini, aşağıdaki kodda gösterildiği gibi yinelemeli olarak uygularım ancak düğüm değerini gerçekten döndürmezsem, işe yaramadığını buldum. Çalışılmayan satırları yorumlayıp, karşılaştırma yapmak için çalışan hatlarla değiştirdim.

Düşüncelerim, gerçek kök düğümüne yapılan başvurunun bir kopyasının ekleme işlevine aktarılmasından dolayı, her işlev çağrısında yapılan değişikliklerin bellekteki gerçek nesnede yapıldığı, dolayısıyla bir düğüm eklendiysem sol ya da sağ dalda saklanmalıdır.

Kendimi çok utandırıyorum çünkü biliyorum ki burada gerçekten basit bir şey eksik olmalıyım, ama java argümanı geçiyor gibi görünüyor bana neden yanlış olduğumu merak ediyor. Yardım için teşekkürler. Eğer boş olacak bir şeyi veya başka kök dönmek zorunda böylece void add yönteminde, sen TreeNode add sonucu eşit kök ayarlama çünkü

public class BinaryTree { 

    TreeNode root; 

    public BinaryTree(){ 
     root = null; 
    } 

    void add(int item){ 
     root = add(root,item); 
     //add(root,item); 
    } 

    //public void TreeNode add(TreeNode node, int item){ 
    public TreeNode add(TreeNode node, int item){ 
     if(node == null){ 
      node = new TreeNode(item); 
     } else if(item <= node.getItem()){ 
      node.setLeft(add(node.getLeft(),item)); 
      //add(node.getLeft(),item); 
     } else if(item > node.getItem()){ 
      node.setRight(add(node.getRight(),item)); 
      //add(node.getRight(),item); 
     } 
     return node; 
     //return; 
    } 
    static void printTree(BinaryTree tree){ 
     printTree(tree.root); 
    } 
    static void printTree(TreeNode node){ 
     if(node == null){ 
      System.out.println("Tree Empty"); 
      return; 
     } 
     if(node.getLeft() != null) 
      printTree(node.getLeft()); 
     if(node.getRight() != null){ 
      System.out.print(node.getItem()+ ", "); 
      printTree(node.getRight()); 
     } else { 
      System.out.print(node.getItem()+ ", "); 
     } 
     return; 

    } 

    public static void main(String args[]){ 
     BinaryTree tree1 = new BinaryTree(); 
     tree1.add(10); 
     tree1.add(3); 
     tree1.add(5); 
     printTree(tree1); 
    } 
}` 
+0

Kökünüz boşsa, bunu bir şeye ayarlamanız gerekir. Eğer null (node, item) eklemek için geçiş yaparsanız, yeni bir node yaratırsınız, ancak siz onu geri döndürene ve onunla bir şey yapana kadar fonksiyonun dışında herhangi bir yere referans verilmez. –

+0

Elbette! Teşekkürler tünel vizyonu vardı! – rf22

cevap

1

öyle. Örneğin, ilk öğeyi BST'ye ekleyelim. TreeNode add yöntemini çalıştırdıktan sonra, void add yönteminize en sonunda root atanacaktır, çünkü bir şey döndürülmelidir. Bir şey döndürmezsen ne olacağıyla ilgili bir özet.

void add(10) gets executed 
root = add(root, 10) 
TreeNode add(root, 10) gets executed 
if(node == null) evaluates to true 
node = new TreeNode(10); // this is where java being pass by value matters 

O kök aslında Ancak 10 olarak madde değerine sahip yeni TreeNode nesneye değişiyor düşünüyorum, bu olamaz. Parametreleri alan bir yöntem çağrıldığında, bu parametrelerdeki nesnelere işaret eden işaretçiler yapılır. Böylece TreeNode add(root, 10) çağrısı, root'a bir işaretçi oluşturur. Bu işaretçi node olarak adlandırılır, bu yüzden node'u son satırda değiştirdiğinizde, node işaretçisini değiştirerek root işaretini değiştirir. node'u döndürmezseniz, bu referansla yeni oluşturduğunuz yeni TreeNode nesnesine hiçbir şey yapmazsınız, böylece Java'nın çöp toplamada kaybolması sağlanır.

+0

Çalışılmayan satırları yorumladım, bu nedenle geçersiz ekleme yöntemimde aslında hiçbir atamadan yalnızca çağrı ekleme (kök, öğe) kullanıyordum. Ama cevabınız problemi çözdü, null kök durumundaki yeni oluşturulan düğüm ile hiçbir şey yapmıyordum. Teşekkürler!! – rf22

+0

Sorun değil, cevabı faydalı bulursanız kabul edildi olarak işaretlediğinizden emin olun. Kendine iyi bak. –