• Java基础----ArrayList中的clear方法以及ArrayList对象


    今天在做Leetcode 102. 二叉树的层序遍历 时, 不管怎么试,每一层的输出都为空,如下图:

    上述结果所使用的代码如下。

     1     public List<List<Integer>> levelOrder(TreeNode root) {
     2         if(root == null) return null;
     3         List<List<Integer>> res = new ArrayList<>();
     4         Queue<TreeNode> queue = new LinkedList<>();
     5         queue.add(root);
     6         TreeNode dummy = new TreeNode(Integer.MIN_VALUE);
     7         queue.add(dummy);
     8         ArrayList<Integer> level = new ArrayList<>();
     9         while(!queue.isEmpty()){
    10             TreeNode temp = queue.poll();
    11             if(temp.val == dummy.val) {
    12                 res.add(level);
    13                 System.out.println(level);
    14                 level.clear();
    15                 if(!queue.isEmpty()) {
    16                     queue.offer(dummy);
    17                 }
    18             }else{
    19                 level.add(temp.val);
    20                 if(temp.left != null) {
    21                     queue.offer(temp.left);
    22                 }
    23                 if(temp.right != null) {
    24                     queue.offer(temp.right);
    25                 }
    26             }
    27         }
    28         return res;
    29     }

    后来经过检查,用来存每一层元素的level,只在进入循环之前创建了一次,因此其地址值不变,如果将其加入到res中,当一层遍历结束加入到res之后,接着又执行了level.clear()方法,该clear方法每一次都把level中的元素清空,所以产生了每层输出都为空的结果,经过以上分析之后,把代码做出如下修改:

     1 public List<List<Integer>> levelOrder(TreeNode root) {
     2     if(root == null) return null;
     3     List<List<Integer>> res = new ArrayList<>();
     4     Queue<TreeNode> queue = new LinkedList<>();
     5     queue.add(root);
     6     TreeNode dummy = new TreeNode(Integer.MIN_VALUE);
     7     queue.add(dummy);
     8     ArrayList<Integer> level = new ArrayList<>();
     9     while(!queue.isEmpty()){
    10         TreeNode temp = queue.poll();
    11         if(temp.val == dummy.val) {
    12             res.add(level);
    13             level = new ArrayList<>();
    14             if(!queue.isEmpty()) {
    15                 queue.offer(dummy);
    16             }
    17         }else{
    18             level.add(temp.val);
    19             if(temp.left != null) {
    20                 queue.offer(temp.left);
    21             }
    22             if(temp.right != null) {
    23                 queue.offer(temp.right);
    24             }
    25         }
    26     }
    27     return res;
    28 }

    修改完了之后,还是有点疑惑,然后去知乎搜了一下,看到了大神的解答https://www.zhihu.com/question/31203609

  • 相关阅读:
    for循环,pydev提示未使用的变量,解决办法
    sc 与net命令的区别
    Selenium测试Ajax程序(转)
    Python yield 使用浅析(转)
    python操作Excel读写--使用xlrd
    Python操作Mysql实例代码教程在线版(查询手册)
    MySQL之alter语句用法总结
    使用WebDriver遇到的那些坑(转)
    python 列表转为字典的两个小方法
    python
  • 原文地址:https://www.cnblogs.com/zhang-yi/p/13123776.html
Copyright © 2020-2023  润新知