/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Deque<TreeNode> queue = new LinkedList<TreeNode>();
List<List<Integer>> levelListAll = new ArrayList<List<Integer>>();
queue.offer(root);
while(!queue.isEmpty()){
int level_size = queue.size();
List<Integer> levelList = new ArrayList<Integer>();
for(int i=0;i<level_size;i++){
TreeNode node = queue.poll();
levelList.add(node.val);
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
levelListAll.add(levelList);
}
return levelListAll;
}
}
遇到了错误Line 19: error: incompatible types: ArrayList<List<Integer>> cannot be converted to List<ArrayList<Integer>> List<ArrayList<Integer>> levelListAll = new ArrayList<List<Integer>>(); ^ Line 34: error: incompatible types: List<Integer> cannot be converted to ArrayList<Integer> levelListAll.add(levelList); ^ Line 36: error: incompatible types: List<ArrayList<Integer>> cannot be converted to List<List<Integer>> return levelListAll; ^ 3 errors
这个错误的原因是使用了 List<ArrayList<Integer>> levelListAll = new ArrayList<List<Integer>>();
而这里本来应该是 List<List<Integer>> levelListAll = new ArrayList<List<Integer>>();
gpt给出的解释是
在这段代码中,问题在于声明的变量类型和初始化的类型不匹配。
声明的变量类型是 List<ArrayList<Integer>>
,它声明了一个列表,其中的每个元素都是 ArrayList<Integer>
类型的列表。这意味着你期望使用 ArrayList<Integer>
的列表。
而在初始化时,你试图将其初始化为 new ArrayList<List<Integer>>()
. 这个初始化表达式创建了一个 ArrayList<List<Integer>>
类型的对象,其中的每个元素都是 List<Integer>
类型的列表。这与声明的类型不匹配,因为声明的类型期望使用的是 ArrayList<Integer>
类型的列表,而不是 List<Integer>
类型的列表。
正确的声明应该是 List<List<Integer>>
,以匹配初始化时使用的类型。
按照我的理解,右边的始终应该比左边具体,右边是ArrayList,左边就应该是List,现在最内层,右边是List,左边是ArrayList,左边比右边具体了,就抽象了。