0

このコードでは、リンクリストに保存されているすべてのファイルオブジェクトを示しています。私はこれを再帰的に実行しているので、バイナリツリー全体を調べることができます。

私の仕事は、ツリーのどのレベルで各Fileオブジェクトが配置されているかを数えることです。

再帰を使用してこれを行う方法は?内部の変数を数えることだけを考えていたのですが、レベルが下がったらどこで値を引くのかわかりません。

何か案は?

public void display(T node)
{
    Node temp = node;

    if (temp != null)
    {
        display(temp.left);
        display(temp.right);
    }
}
4

2 に答える 2

2

これは宿題/学習の問題のように見えるので、ここにいくつかのヒントがあります。

  • そのようなカウンターは必要ありません。
  • きちんとした解決策はdisplayFiles、再帰ヘルパー関数を使用してすべての作業を行う単純な非再帰関数を作成することです。現在のレベルは、ヘルパー関数の引数です。

さて、これが解決策のスケッチです:

public void display(T node) {
    doDisplay(node, 0);
}

private void doDisplay(T node, int level) {
    if (node != null) {
        // output this node ... including the level
        display(node.left, level + 1);
        display(node.right, level + 1);
    }
}

変数のインクリメントとデクリメントはないため、メソッドは完全に再入可能であることに注意してください。

于 2012-11-07T03:38:46.363 に答える
1

関数の最初でレベルをインクリメントし、最後の行の直前でレベルをデクリメントします

private static int level = 0;    
public void displayFiles(T node)
{
    Node temp = node;

    if (temp != null && temp.leftChild != null && temp.rightChild != null)
    {
     ++level;
        displayFiles(temp.leftChild);
        displayFiles(temp.rightChild);
    }
    --level;
}

新しいノードに入るときにレベルをインクリメントし、現在のノードを離れて前のノードに移動するときにレベルをデクリメントします。

于 2012-11-07T03:09:56.403 に答える