首先,不要误解我的意思,我知道如果ArrayDeque.offer()
中指定的元素为空,那么就会有NullPointerException
,我的意思是,如果我想要提供某个东西,那么是否有一个语法上有效的可行替代方案,指示它本身为空?
问:给定一棵二叉树的根,检查它是否是自身的镜像(即,围绕其中心对称)。
制约因素:
1.树中的节点数在[1,1000]范围内。
2. -100〈=节点值〈= 100
答:
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
这就是我的问题。
4条答案
按热度按时间u5rb5r591#
我认为你应该使用Null Object Pattern。你可以将任何对象(最好是不可变的)定义为
null
值,并在任何地方使用它,而不是null
。例如,如果你使用Jackson
:另一种解决方案是,您可以在
Deque
中使用Optional
而不是TreeNode
:8yoxcaq72#
谢谢你的启发!这是我的最终版本算法:
然而,这不是一个很好的算法这个问题,因为它需要很多额外的内存空间的堆栈。
dzjeubhm3#
除了ArrayDeque,为什么不简单地使用LinkedListaddLast方法,
wrrgggsh4#
简单但不太好的解决方案:
ArrayDeque<Optional<MyClass>>
,MyClass
是你的类,然后你可以添加一个空的Optional。更好的解决方案:
但是为了更好地解决你的问题,一般来说我建议你有一些特殊的元素,定义为常量,如下所示:
如果需要更多信息,
static public final MyClass STOP_INDICATOR = new MyClass();
和MyClass可能会安装一些特殊的TOR。如果您随后检索并检查它,您甚至可以使用 identity 检查
a == b
,而不必使用a.equals(b)
,因为它是一个常量。