2017-05-13 74 views
0

我有一種按照字母順序在BST中插入節點的方法,但是當我比較兩個字符串時我有一個無限循環,我認爲當它通過比較時值不會改變所以它再次與相同的值進行比較,導致無限循環。我認爲auxT節點沒有使用遞歸方法更新值,因此它會反覆比較相同的值。向BST插入節點時出現無限循環

class BST { 

    BSTNode root; 

    public BST() { 
     root = null; 
    } 

    BSTNode aux = new BSTNode(); 

    BSTNode insertNames(BSTNode T , int data, String name, double salary) { 
     if (root == null) { 
      T = new BSTNode(); 
      T.setName(name); 
      root = T; 
     } else { 
      aux = root; 

      if (name.compareTo(aux.getName()) < 0) 
       aux.setLeft(insertNames(aux.getLeft(),data, name, salary)); 
      else if (name.compareTo(aux.getName()) >= 0) 
       aux.setRight(insertNames(aux.getRight(),data, name, salary)); 
     } 

     return T; 
    }  
} 

class Main{ 
public static void main(String[] args){ 

     BST alpha=new BST(); 
     BSTNode root = new BSTNode(); 
     alpha.insertNames(root, 0, "Roy", 0); 
     alpha.insertNames(root, 0, "Joseph", 0); 
} 
} 
+0

的[我如何在Java中比較字符串?(可能的複製http://stackoverflow.com/questions/513832/how -do-i-compare-strings-in-java) – CodingNinja

+0

當你逐行調試代碼時你發現了什麼?這應該告訴你爲什麼它有一個無限循環。 –

+0

這些值不會改變,但我不明白爲什麼,當它到達else語句中的第一個if語句時,它會在遞歸部分再次出現時將值插入到'aux'左邊方法內部的參數沒有改變 – Valenzuela

回答

0
package com.gati.dsalgo.string; 

class BST { 

    BSTNode root; 

    public BST() { 
     root = null; 
    } 

    void insertNames(int data, String name, double salary) { 
     root = insertNames(root, data, name, salary); 
    } 

    BSTNode insertNames(BSTNode root, int data, String name, double salary) { 
     if (root == null) { 
      root = new BSTNode(); 
      root.setName(name); 
      return root; 
     } 

     if (name.compareTo(root.getName()) < 0) 
      root.setLeft(insertNames(root.getLeft(), data, name, salary)); 
     else if (name.compareTo(root.getName()) >= 0) 
      root.setRight(insertNames(root.getRight(), data, name, salary)); 

     return root; 
    } 
} 

public class Main1 { 
    public static void main(String[] args) { 

     BST alpha = new BST(); 
     alpha.insertNames(0, "Roy", 0); 
     alpha.insertNames(0, "Joseph", 0); 
     System.out.println("hello"); 
    } 
} 

class BSTNode { 
    private String name; 
    BSTNode left; 
    BSTNode right; 

    public void setName(String name) { 
     this.name = name; 

    } 

    public void setRight(BSTNode right) { 
     this.right = right; 
    } 

    public void setLeft(BSTNode left) { 
     this.left = left; 
    } 

    public BSTNode getRight() { 

     return right; 
    } 

    public BSTNode getLeft() { 
     return left; 
    } 

    public String getName() { 

     return name; 
    } 

} 
0

請在遞歸結束邏輯中返回節點。

 /* If the tree is empty, return a new node */ 
if (root == null) { 
    root = new BSTNode(); 
    root.setName(name); 
    return root; 
} 

/* Otherwise, recur down the tree */ 
if (name.compareTo(root.getName()) < 0) 
    root.setLeft(insertNames(root.getLeft(), data, name, salary)); 
else if (name.compareTo(aux.getName()) >= 0) 
    root.setRight(insertNames(root.getRight(), data, name, salary)); 

/* return the (unchanged) node pointer */ 
return root; 

,或者可以解決迭代的方式

if (localRoot == null) { 
    newNode = new Node <V> (value, null); 
    root = newNode; 
    size++; 
    return true; 
} 
if (comparator != null) { 
//Some code 
} else { 
    Comparable << ? super V > v = (Comparable << ? super V >) value; 
    while (localRoot != null) { 
     parent = localRoot; 
     cmp = v.compareTo(localRoot.getValue()); 
     if (cmp < 0) { 
      localRoot = localRoot.getLeftChield(); 
     } else if (cmp > 0) { 
      localRoot = localRoot.getRightChield(); 
     } else { 
      localRoot.incrementBy(nCopies); 
      return true; 
     } 
    } 
    newNode = new Node <V> (value, parent); 
    if (cmp < 0) { 
     parent.setLeftChield(newNode); 
    } else if (cmp > 0) { 
     parent.setRightChield(newNode); 
    } 
    size++; 
    return true; 
} 
return false; 
+0

我嘗試了遞歸方式,並且仍然遇到由無限循環產生的相同堆棧溢出錯誤,我在描述中添加了我的'main'類,我很確定'alpha.insertNames'中的''''參數是否正確,我也檢查過調試器,看起來一切正常。 – Valenzuela

+0

我一步一步地調試,並意識到值永遠不會改變,我總是比較相同的,所以它會做'if'句子'root.setLeft'或'root.setRight'內的內容,但值不會當它再次發生變化時,它會一遍又一遍地做同樣的事情。 – Valenzuela

+0

我調試你的代碼根你的返回是不同的,然後根你的檢查。 BSTNode T參數應該檢查遞歸結束條件。 –