java如果我想在ArrayQue中提供null,我该怎么做
首先,别误会我。我知道如果指定的元素在ArrayDeque.offer()
中为空,则会有NullPointerException
。我的意思是,如果我想提供一些东西,是否有一个可行的替代方案在语法上是有效的,这表明它本身是无效的?
情况如下:
Q: Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its centre).
Constraints:
1.The number of nodes in the tree is in the range [1, 1000].
2.-100 <= Node.val <= 100
A:
class Solution {
public boolean isSymmetric(TreeNode root) {
Deque<TreeNode> queue = new ArrayDeque<>();
Deque<Integer> stack = new ArrayDeque<>();
if (root != null) {
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (stack.isEmpty() || stack.peek() != node.val) {
stack.push(node.val);
} else {
stack.pop();
}
if (node != null) {
queue.offer(node.left);
queue.offer(node.right);
}
}
if (!stack.isEmpty()) {
return false;
}
}
}
return true;
}
}
但这其中有一些问题:
queue.offer(node.left); // offer a null is valid
queue.offer(node.right); // offer a null is valid
这就是我的问题
# 1 楼答案
简单但不太好的解决方案:
ArrayDeque<Optional<MyClass>>
和MyClass
作为你的类。然后您可以添加一个空的可选项李>更好的解决方案:
但为了更好地解决你的问题,通常我建议你使用特殊元素,定义为常数,如下所示:
static public final MyClass STOP_INDICATOR = new MyClass();
如果需要更多信息,MyClass可能会安装一些特殊的CTOR如果随后检索并检查它,甚至可以使用标识检查
a == b
,而不必使用a.equals(b)
,因为它是一个常量# 2 楼答案
谢谢你激励我!这是我的最终版本算法:
然而,对于这个问题来说,它不是一个好的算法,因为它需要大量额外的堆栈内存空间
# 3 楼答案
我觉得你应该用Null Object Pattern。您可以将任何对象(最好使其不可变)定义为
null
值,并在任何地方使用它,而不是null
。例如,如果你使用Jackson
:另一种解决方案是,您可以在
Deque
中使用Optional
而不是TreeNode
: