【问题标题】:Java: Find the Depth of a Node not Found in a BSTJava:查找 BST 中未找到的节点的深度
【发布时间】:2014-12-15 15:26:10
【问题描述】:

我有一个存储在字符串中的二叉搜索树,我已经能够找到 BST 中存在的字符串的深度或高度,但我想要做的是找到一个深度是多少不在 BST 中的字符串。

这是我目前使用的算法,它可以完美地找到 BST 中已经存在的字符串的深度:

public int getDepth(String data) {
    return getDepth(root, data, 1);
}

public int getDepth(Node root, String data, int level) {
    if (root == null)
        return 0;

    if (root.getData().getName().equals(data))
        return level;

    int ret = getDepth(root.leftChild, data, level + 1);
    if (ret != 0)
        return ret;

    ret = getDepth(root.rightChild, data, level + 1);
    return ret;

}

我的 BST 有按以下顺序插入的元素:“猫”、“鸟”、“狗”、“老虎”、“大象”、“熊猫”。

所以二叉树应该是这样的:

                                   cat
                                  /   \
                               bird   dog
                                         \
                                        tiger
                                       /     \
                                  elephant  panda

当我在“dog”上调用该方法时,输出是:dog is at depth 2

当我在“hippo”上调用该方法时,输出是:hippo is at depth 0

但是“hippo”的预期输出应该是:hippo is at depth 5

因为河马将是大象的孩子,已经进入深度 4。

那么对于另一种情况,如果我想找到不在 BST 中的“牛”的深度怎么办?它必须是 dog 的左孩子,所以深度应该是 3,但是,我仍然得到 0。

所以问题是不使用删除和/或恢复方法我需要什么情况或我需要在上述方法中修改什么情况以确定不在内部的字符串的深度BST?

【问题讨论】:

    标签: java binary-search-tree depth


    【解决方案1】:

    试试这个修改后的第二个getDepth() 方法:

    public int getDepth(Node root, String data) {
        if (root == null || root.getData().getName().equals(data)) {
            // you hit the spot - either you are below a leaf
            // or you matched the node
            // if you were doing insert/replace, you would put the data on this spot
            return 0;
        }
    
        if (isSmallerThan(data, root.getData().getName())) {
            return 1 + getDepth(root.leftChild, data);
        }
        return 1 + getDepth(root.rightChild, data);
    }
    

    如果a 小于 小于b,则isSmallerThan(String a, String b) 返回true。此方法取决于您希望如何比较字符串。

    而且你不需要一直传递level...

    【讨论】:

    • 我喜欢!谢谢您的帮助! BST 对我来说是新的,所以我仍在尝试弄清楚它们。
    【解决方案2】:

    您需要模拟一个insert 操作,它可以完成真正插入所做的所有事情,除了它不会将新节点附加到树并跟踪深度。
    搜索正确的位置以插入新值 - 从根开始,将值与当前节点进行比较,根据比较结果向下树。
    一旦找到正确的位置,不要将值添加到树中,只需返回深度即可。

    【讨论】:

    • 我已经尝试过的好主意,但我仍然得到相同的结果,因为我猜我返回的内容是错误的,这就是混乱的来源。
    • @zoltack429 Jan 给出了一个很好的实现示例,将其与您自己的进行比较,看看逻辑上的差异在哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多