我有以下代码在BST中搜索节点:

private Node<AnyType> searchAndGetNode(AnyType value) {
        Node<AnyType> currentNode = root;
        while(currentNode != null && currentNode.getData() != null) {
            if (value.compareTo(currentNode.getData()) == 0) {
                return currentNode;
            } else if (value.compareTo(currentNode.getData()) < 0) {
                currentNode = currentNode.getLeft();
            } else {
                currentNode = currentNode.getRight();
            }
        }
        return null;
    }


我知道Optional.ofNullable()获取Optional对象,然后使用isPresent()避免进行空检查。但是我想不出任何巧妙的方法来避免在上述方法的while循环中进行空检查比较。我正在使用Java8。请提出建议。

最佳答案

您应该删除条件的&& currentNode.getData() != null部分,因为在二叉树中没有null值是没有意义的(您不能在null上调用compareTo,因此您要将它插入树中的什么位置?)。除此之外,您拥有的空检查没有任何问题。

但是,为了提高性能,您不应为每个值两次调用compareTo,而应调用一次并检查结果:

int cmp = value.compareTo(currentNode.getData());
if (cmp == 0) {
    return currentNode;
} else if (cmp < 0) {
    currentNode = currentNode.getLeft();
} else { // cmp > 0
    currentNode = currentNode.getRight();
}

10-07 23:05