作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对 java.util.TreeMap:
的以下方法有点困惑:
static <K,V> TreeMap.Entry<K,V> successor(Entry<K,V> t) {
if (t == null)
return null;
else if (t.right != null) {
Entry<K,V> p = t.right;
while (p.left != null)
p = p.left;
return p;
} else {
Entry<K,V> p = t.parent;
Entry<K,V> ch = t;
while (p != null && ch == p.right) {
ch = p;
p = p.parent;
}
return p;
}
}
此方法用在 TreeMap 的 containsValue 方法中。并且它被告知检索第一个条目的后继者和先前检索到的后继者的后继者等等。因此,上述方法检索整个 TreeMap 的条目。但是我不太明白它是如何运作的,它是如何寻找继任者的?
谢谢!
最佳答案
这适用于二叉搜索树,它使用以下事实:
所以,这正是算法正在做的事情:
t
为根的子树中,因此它会搜索 t< 的第一个父节点
是其左子树中的一个节点。示例:
4
/ \
/ \
/ \
/ \
2 6
/ / \
/ / \
1 5 7
else
情况)。此外,作为“测验”,请确保您了解 while (p != null && ch == p.right)
中的条件 p != null
不满足。
关于java - TreeMap 如何搜索给定条目的后继者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18063394/
我对这样一个问题很感兴趣:正如我们所知,红黑树 提供了诸如后继(高于该条目的第一个元素)和predecessor ,即对数时间。在 Java 文档 中写道,为了提供像后继这样的操作,您可以只使用 su
我了解BST中后继者的一般概念。我的代码仍然有问题,我不明白问题出在哪里。 编译器运行它启动的程序并在几秒钟后结束。我认为这是“段错误”类型的错误(我使用的是 Windows 和 Dev C++)。
我是一名优秀的程序员,十分优秀!