【问题标题】:Array initialized redundant zeros while printing binary tree paths打印二叉树路径时数组初始化冗余零
【发布时间】:2012-09-29 04:25:47
【问题描述】:

我尝试打印二叉树中的所有路径。我能够打印树中的所有路径。但问题是它没有在输出中打印一些冗余零。数组是否用零初始化?如果是,那么如何克服这种情况下的问题?我正在学习,这就是为什么我在这里发布这个问题以了解更多信息并克服错误。

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 

【问题讨论】:

    标签: java arrays data-structures tree binary-tree


    【解决方案1】:

    是的,在 Java 中,new int[X] 创建一个零初始化数组。

    来自JLS §4.12.5

    每个类变量、实例变量或数组组件在创建时都会使用默认值进行初始化(第 15.9 节、第 15.10 节)...对于 int 类型,默认值为零,即 0。

    无论如何,你得到零的原因是因为你每次插入一个元素时都会增加pathlen两次,所以你插入一个元素然后跳过下一个元素(让它保持在 0 ):

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

    你只需要增加一次。

    【讨论】:

    • 是的,我认为路径[pathlen++] = tree.val;不是必需的。只有路径[pathlen] = tree.val;够了
    【解决方案2】:

    您将 pathlen 增加两次。删除第二个 pathlen++。是的,Java 会将所有原语初始化为默认值,包括数组中的原语。

    【讨论】:

    • 不仅仅是原语:一切都被初始化了。引用类型只得到null
    【解决方案3】:

    你犯的错误在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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2021-05-16
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多