【问题标题】:Why is my preorder traversal returning an empty list?为什么我的预购遍历返回一个空列表?
【发布时间】:2021-12-26 18:58:29
【问题描述】:

我试图了解为什么代码返回一个空列表。 我不是在寻找解决问题的方法。 解决方案已经存在于What is wrong with my Preorder traversal?

我想了解一下,我目前对递归和使用全局变量时的调用堆栈的理解有什么不正确的地方。

class Solution {
    ArrayList<Integer> list;
    public List<Integer> preorderTraversal(TreeNode root) {
        list = new ArrayList<Integer>();
        preOrder(root);
        return list;
    }
    public void preOrder(TreeNode node){
        System.out.println(list.toString());
        if(node == null)
            return;
        
        list.add(node.val);
        
        //System.out.println(list.toString());
        
        preorderTraversal(node.left);
        preorderTraversal(node.right);
    }
}

对于以下树:[1,null,2,3]

我注意到在第一次打印调用中 我得到 7 个空列表

[]
[]
[]
[]
[]
[]
[]

在我的第二次打印电话中,我得到以下信息

[1]
[2]
[3]

为什么我的全局变量列表没有“保存”或“附加”到下一个调用堆栈? 似乎有多个列表对象被使用。

【问题讨论】:

  • 提示:每次你调用preorderTraversal 你的list 都会被清除。
  • list = new ArrayList&lt;Integer&gt;(); list 变量重新分配给新创建的空 List 对象。所以不可能多次调用preorderTraversal“追加”到同一个列表,因为你明确地编码了那个方法,所以它做的第一件事就是创建一个全新的列表
  • 嗯……我明白了……

标签: java recursion binary-tree preorder


【解决方案1】:

因为您使用 preorderTraversal 和左右节点,所以每次它都会用新的空列表覆盖列表值,所以您应该像这样使用带有左右节点的 preOrder

public void preOrder(TreeNode node){
    if(node == null)
        return;
        
    list.add(node.val);
        
    preOrder(node.left);
    preOrder(node.right);
}

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多