2017-08-09 1615 views
1

我有一個紅黑樹。設置遞歸調用數限制 - Java

我想打印它的順序(所以數字將從最小到最大打印)。

這裏的印刷方法:

public void printTreeInOrder(Node node){ 
     //in-order printing (sorted) 
     if (!(isNull(node))){ 
      printTreeInOrder((node.getLeft())); 
      System.out.println(node.getValue()); 
      printTreeInOrder(node.getRight()); 
     } 
    } 

但是我只想打印k個最小號。如果我可以限制遞歸調用的次數,例如保持一個小數位數並計算該方法被調用的次數,那將很容易。

但我怎麼在遞歸函數?

我想了一個全局變量k和功能指望它,但它不好聽,,k是一個變量本身,它不是恆定的。 我有一種方法可以計算在遞歸函數中打印的數字數量嗎?

謝謝,

艾倫

+2

我知道這並不回答這個問題......但在實踐中這種遞歸的迭代版本往往會表現得更好,並像早期停止的一些東西是稍微向前伸直(亦即。'''如果(--k == 0)return;''')。對於這種遍歷,你需要一個'''Stack >'''其中Action是一個'''enum Action {GO_LEFT,PRINT,GO_RIGHT}''' –

+0

似乎一方面你想限制遍歷的深度,同時你想要底部K數....你是否真的想要說要限制要打印的數字的數量(K)?如果希望始終獲得最小的數字,則無法限制遍歷的深度。請糾正你的問題 –

+0

@ValentinRuano我其實不知道你的意思。我只想打印樹中n個數字中的k個數字,然後按順序排序。我看不出矛盾。 – Alan

回答

2

該方法返回剩餘的要被打印元件的數量和接受從該節點被打印元件的最大數目。

public int printTreeInOrder(Node node, int k){ 
    //in-order printing (sorted) 
    if (k>0 && !(isNull(node))){ 
     k = printTreeInOrder(node.getLeft(),k); 
     if (k>0) { 
      System.out.println(node.getValue()); 
      k--; 
     } 
     return printTreeInOrder(node.getRight(),k); 
    } 
    return k; 
} 
+0

謝謝!訣竅嗎。 – Alan