У меня есть это двоичное дерево
3
/ \
9 20
/ \
15 7
Я хочу напечатать обход уровня в этом формате
[
[3],
[9,20],
[15,7]
]
поэтому я написал этот код, используя очередь и два списка
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue=new LinkedList<TreeNode>();
List<Integer> list=new ArrayList<>();
List<List<Integer>> res=new LinkedList<>();
if(root!=null)
{
queue.add(root);
}
while(!queue.isEmpty())
{
int size=queue.size();
for(int i=0;i<size;i++)
{
TreeNode tempNode=queue.poll();
list.add(tempNode.val);
if(tempNode.left!=null)
queue.add(tempNode.left);
if(tempNode.right!=null)
queue.add(tempNode.right);
}
res.add(list);
list.clear();
}
return res;
}
}
но когда я проверяю вывод, он возвращает
[[],[],[]]
Я потратил более 1 часа на устранение проблемы, и я убежден, что мой код правильный (а это не так!)
Я не знаю, что очищает список res после того, как я добавляю в него данные.
пожалуйста, помогите мне исправить ошибку.
Я считаю, что list.clear () также очищает добавленный элемент списка в разрешении.
это так, тогда предположим
x=34;
list.add(x);
x=45;
System.out.println(list); // it will still print [34]
, но с использованием списка списка и после добавления элемента к нему, а также при изменении внутреннего списка .. он также изменяет ваш список списка.
почему?
int x=3;
li.add(x);
x=45;
res.add(li);
System.out.println(li);
li.remove(0);
li.add(23);
System.out.println(res);