/**
 * 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,左边比右边具体了,就抽象了。

03-17 06:50