2013-12-10 159 views
4
private void searchForK(V value , DictionaryNode<K,V> node){ 
     if(node != null){ 
      if(((Comparable<V>)value).compareTo(node.value) == 0) { 
       obtainKey = node.key; 
       return; 
      } 
      searchForK(value,node.lChild); //recursive since we have to simply look 
      searchForK(value,node.rChild);//through each child which is itself another searchforK 
     }  
    } 

public K getKey(V value) { 
    searchForK(value,rNode); 
    return obtainKey; 

}//end getKey 

如何將上述代碼更改爲getKey的函數?我對遞歸感到困惑。我想擺脫searchForK函數,並讓getKey具有與searchForK相同的功能。我怎樣才能改變這段代碼,使我只有getKey?

這是我在改變兩個功能的嘗試:

public K getKey(V value) { 
     // private void searchForK(V value , DictionaryNode<K,V> node){ 
     if(rNode != null){ 
      if(((Comparable<V>)value).compareTo(rNode.value) == 0) { 
       obtainKey = rNode.key; 
       return (K) obtainKey; 
      } 
       rNode = rNode.lChild; 
       getKey(value); 
       rNode = rNode.rChild; 
       getKey(value); 
      } 
     return null; 

它不行爲相同的方式,雖然,我究竟做錯了什麼?

這些都是我的全局變量:

public class BinarySearchTree<K,V> implements DictionaryADT<K,V> { 
    /* data fields */ 

    /* Node Variables */ 
    public DictionaryNode<K,V> rNode; //Root Node 
    public DictionaryNode<K,V> pNode; //Parent Node 
    K obtainKey; 

我是否應該更換rNode是CURNODE在我的情況?

+0

我還是個新手,當談到遞歸。這對我來說有點困難。 – TwilightSparkleTheGeek

+0

您將不得不使用兩個引用來跟蹤您當前正在遞歸的位置,因爲您無法通過每次遞歸調用將引用傳遞給節點。你在搜索什麼類型的數據結構? – robbmj

+0

我正在搜索二進制搜索樹。這是殺了我的男人。遞歸是。謝謝你的協助。我還有另一部分需要幫助。你能和我在一起嗎?我是計算機科學系的學生,本科生。 – TwilightSparkleTheGeek

回答

1
private DictionaryNode<K,V> curNode = rNode; 

public K getKey(V value) { 

    if (curNode != null) { 
     int c = ((Comparable<V>)curNode.value).compareTo(value); 

     if (c == 0) { 

       K key = curNode.key; 

       curNode = rNode; // reset curNode 
       return key; 
     } 
     else if (c < 0 && curNode.lChild != null) { 
       curNode = curNode.lChild; 
       return getKey(value); 
     } 
     else if (curNode.rChild != null) { 
       curNode = curNode.rChild; 
       return getKey(value); 
     } 
    } 
    curNode = rNode; // reset curNode 
    return null; 

}

+0

爲什麼你的DictionaryNode不在函數中? – TwilightSparkleTheGeek

+1

啊我看你現在在做什麼,一秒鐘 – robbmj

+0

你呢?你怎麼知道我在做什麼? – TwilightSparkleTheGeek