为什么RR的判断不需要加上node.left != null的判断,感觉会有空指针问题
来源:2-7 红黑树中添加新元素
thok8s
2023-09-06 12:25:41
为什么不是这么写:
if (isRed(node.left) && null != node.left && isRed(node.left.left)) {
rightRotate(node);
}
而是这样写:
(isRed(node.left) && isRed(node.left.left)) {
rightRotate(node);
}
比如添加一个值为1的元素,递归到 1 - 2 这个三节点 (1为红色,2为黑色),此时由于1已经存在了,所以不会有任何节点添加进行,然后就进入了LL/RR/flipColors这三个操作的判断,此时LL不成立,RR判断的时候,node.left.left 会有空指针问题的
但是实际上运行起来却没问题 -_-
希望老师帮忙解惑,谢谢
1回答
因为如果 node.left 是空的话, isRed(node.left) 就会返回 false(请看一下 isRed 的逻辑)。
isRed(node.left) 返回 false 以后,根据短路逻辑, if 里 && 的第二个条件根本不会执行,所以不会有空指针异常。
当然,从防御性编程的角度,按照你的写法完全没有问题。
继续加油!:)
相似问题