2015-11-25 33 views
1

我有一個遍歷二叉搜索樹的遞歸方法。每次訪問具有鍵屬性的節點時,都會將該節點插入到新的BST中。我的問題是我需要保持有多少節點有關鍵元素的計數。我很難用遞歸方法做這件事。有誰知道如何在遞歸方法中實現「計數器」。我也在下面發佈了我的代碼。以遞歸方法保留已標記節點的數量

public BookBST TraverseInOrder_Pblshr(Node localRoot, String key, BookBST B){ 
    if (localRoot!=null){ 

     TraverseInOrder_Pblshr(localRoot.leftChild, key, B); 

     if(localRoot.B1.GetPublisher().equals(key)){   // if node matches key 
      B.insert(localRoot.B1,3);      // insert into BST (using publisher to order) 
      //System.out.println(localRoot.B1.GetPublisher()+ " this is item has been inserted into subtree"); 
      //System.out.println(localRoot.B1.GetTitle()); 
     } 

     TraverseInOrder_PubYr(localRoot.rightChild, key, B); 
    }; 
    return B; 
} 
+0

爲什麼要把這些事情算作'TraverseInOrder_Pblshr'方法的工作? (或者'..._ PubYr'方法,不管它是什麼。)調用者以'B'引用開始,所以它可以保存'B'的大小,然後運行這個方法,然後比較新的大小'B'之後。不同之處在於擁有鑰匙的物品數量。 –

+0

來想一想......爲什麼你要返回'B'呢?來電者已擁有它。 –

回答

1

有誰知道如何實現一個遞歸方法的「計數器」。

是的。如果遞歸方法爲void,那麼只需添加int類型的參數count並使返回類型爲int。要增加計數器,只需執行count++;。當遞歸調用該方法,只是做

count = recursiveMethod(count); 

在你的情況,該方法不void,這使得它稍微困難一些。一個技巧是添加int[]類型的額外參數。但是,我建議使用私人幫手方法。不要用這個額外的參數暴露可怕的簽名。

public BookBST TraverseInOrder_Pblshr(Node localRoot, String key, BookBST B){ 
    return helper(Node localRoot, String key, BookBST B, new int[1]); 
} 

private BookBST helper(Node localRoot, String key, BookBST B, int[] counter) { 
    // You should call **this** method recursiviely, not TraverseInOrder_Pblshr. E.g. 
    // helper(localRoot.leftChild, key, B, counter); 
    // To increment the counter, just do counter[0]++; 
}