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
类型将编译。
我正在研究 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
类型将编译。