【问题标题】:Can't pass null to java recursive search无法将 null 传递给 java 递归搜索
【发布时间】:2016-02-04 11:27:37
【问题描述】:

我正在尝试编写一个简单的递归方法来查看二叉搜索树是否包含值。这是我最初想出的:

static boolean doesContainData(Node root, int data){
    if (root.data == data){
        return true;
    }

    if (root == null){
        return false;
    }

    if (data > root.data){
        return doesContainData(root.right, data);
    }

    else if(data < root.data){
        return doesContainData(root.left, data);
    }
    return false;
}

但是,对于 BST 不包含具有数据的节点的情况,它似乎会抛出 NullPointerException。经过一些测试,我意识到当我将功能更改为这个时,它可以工作:

static boolean doesContainData(Node root, int data){
    if (root.data == data){
        return true;
    }

    if (root == null){
        return false;
    }

    if (data > root.data){
        if (root.right == null){
            return false;
        }
        return doesContainData(root.right, data);
    } 

    else if(data < root.data){
        if (root.left == null){
            return false;
        }
        return doesContainData(root.left, data);
    }
    return false;  
}

我不太清楚为什么后者有效而前者无效。在后者中,我正在检查左/右节点是否为空,但我看不出这与原始方法有何不同。在第一种方法中,我只是再次调用了递归方法,它最终会检查基本情况中的节点。

有什么想法吗?

【问题讨论】:

  • if (root == null){ 永远不会为真,因为使用 root.data 之前会抛出 NullPointerException。

标签: java search recursion binary-tree binary-search-tree


【解决方案1】:

一旦您调用了dosContainData(root.right, data) 或dosContainData(root.left, data),您的方法doesContainData 就会被调用。

这种情况下如果root.left或root.right为null,当你调用下面的方法时,

if (root.data == data){
    return true;
}

在检查 root.data == 数据之前,root.data 将抛出 NullPointerException,因为它不存在。

但是,您以后的方法会检查,在调用 doesContainData 方法之前,root.left 或 root.right 是否为空。如果它为 null,您的方法将返回 false 并终止。因此,最初的问题永远不会发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多