Error: object cannot be converted to TreeNode type (stack error while passing it in function) a question on trees on LeetCode

Error: object cannot be converted to TreeNode type (stack error while passing it in function) a question on trees on LeetCode

我正在研究 LeetCode 问题 https://leetcode.com/problems/binary-tree-preorder-traversal

当我在 solution 方法中创建堆栈并将其传递给 traverse 方法时,编译器给出 error: object cannot be converted to TreeNode (type).

但是,当我将该行与 push(root) 行一起放入 traverse 方法时,错误就消失了。

我不明白为什么会出现这种差异。

错误发生在行TreeNode temp=s.peek();

我的代码:

/**
 * 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<Integer> preorderTraversal(TreeNode root) {
        List<Integer> a=new ArrayList<>();
        Stack<TreeNode> s=new Stack<TreeNode>();
        s.push(root);
        traverse(root,s,a);
        return a;
    }

    void traverse(TreeNode root,Stack s,List<Integer> a) {
        if(root==null) return;
         
        TreeNode temp=s.peek();
        
        while(!s.isEmpty())
        {   
            TreeNode temp=s.peek();
            a.add((temp.val));
            s.pop();
            if(temp.right!=null)
                s.push((temp.right));
            if(temp.left!=null)
                s.push((temp.left));
        }
    }
}

您忘记将泛型添加到 Stack 参数。签名应该是

void traverse(TreeNode root, Stack<TreeNode> s, List<Integer> a);
//                                ^^^^^^^^^^

否则,TreeNode temp = s.peek(); 对隐式类型的结构 Stack<Object> 没有意义。您需要将 Object 转换为 TreeNode 才能通过编译,这是不安全且不必要的。

相反,如果不明显,当您将声明和初始化移到方法中并删除参数时,Stack<TreeNode> s = new Stack<TreeNode>(); 正确指定了泛型类型,因此 peek 赋值给 TreeNode 类型将编译。