1

二分木からすべてのパスを印刷しようとしています。ツリー内のすべてのパスを印刷できます。しかし問題は、出力に冗長なゼロが出力されないことです。配列はゼロで初期化されますか? はいの場合、このような場合の問題をどのように克服しますか? 私は学んでいるので、詳細を学び、エラーを克服するために、この質問をここに投稿しました。

public class PrintAllPath {

static void printAllPaths(Tree tree) {
    int[] paths = new int[1000];
    printPathsRecur(tree, paths, 0);
}

static void printPathsRecur(Tree tree, int paths[], int pathlen) {
    if (tree == null)
        return;
    paths[pathlen++] = tree.val;
    pathlen++;

    if (tree.left == null && tree.right == null) {
        printArray(paths, pathlen);
    } else {
        printPathsRecur(tree.left, paths, pathlen);
        printPathsRecur(tree.right, paths, pathlen);
    }
}

static void printArray(int paths[], int pathlen) {
    for (int i = 0; i < pathlen; i++) {
        System.out.println("Node : " + paths[i]);
    }
}

static Tree insert(Tree tree, int element) {
    Tree tree2 = new Tree(element, null, null);
    if (tree == null)
        tree = tree2;
    else if (element < tree.val)
        tree.left = insert(tree.left, element);
    else
        tree.right = insert(tree.right, element);
    return tree;
}

static void print(Tree tree) {
    if (tree == null)
        return;
    System.out.println(tree.val);
    print(tree.left);
    print(tree.right);
}

public static void main(String[] args) {
    Tree tree = new Tree(new Integer(5), null, null);
    tree = insert(tree, 10);
    tree = insert(tree, 100);
    tree = insert(tree, 11);
    tree = insert(tree, 110);
    tree = insert(tree, 50);
    System.out.println("The tree is as follows : ");
    print(tree);
    printAllPaths(tree);
}
}

出力:

The tree is as follows : 
5
10
100
11
50
110
5 0 10 0 100 0 11 0 50 0 5 0 10 0 100 0 110 0 
4

3 に答える 3

0

pathlen を 2 回インクリメントしています。2 番目の pathlen++ を削除します。はい、Java は配列内のプリミティブを含め、すべてのプリミティブをデフォルト値に初期化します。

于 2012-09-29T04:37:40.097 に答える
0

あなたが犯した間違いはprintPathsRecur(Tree tree, int paths[], int pathlen)

paths[pathlen++] = tree.val;
pathlen++;

pathlen を 2 増やしますpathlen++;コードから削除するだけで問題なく動作します。

static void printPathsRecur(Tree tree, int paths[], int pathlen) {
    if (tree == null)
        return;
    paths[pathlen++] = tree.val;
    //pathlen++;

    if (tree.left == null && tree.right == null) {
        printArray(paths, pathlen);
    } else {
        printPathsRecur(tree.left, paths, pathlen);
        printPathsRecur(tree.right, paths, pathlen);
    }
}
于 2012-09-29T04:39:52.350 に答える
0

はい、Java ではnew int[X]、ゼロで初期化された配列を作成します。

JLS §4.12.5から:

各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます (§15.9、§15.10) ... int 型の場合、デフォルト値はゼロ、つまり 0 です。

とにかく、ゼロを取得する理由は、要素を挿入するたびにpathlen 2 回インクリメントするためです。そのため、要素を挿入してから次の要素をスキップします (0 のままにします)。

paths[pathlen++] = tree.val;
pathlen++;

1 回だけインクリメントする必要があります。

于 2012-09-29T04:31:46.207 に答える