我阅读了更多关于二叉搜索树的内容,然后我发现了二叉搜索树的另一种变体,即八字树,我试图实现它,但不知何故我被卡住了。
所以在我看来,算法是-
public class SplayTreeTest<T extends Comparable<T>> extends BinarySearchTree<SplayTreeTest.TNode<T>,T> {
protected static class TNode<T> extends BinarySearchTree.BSTNode<TNode<T>,T> { }
public SplayTreeTest(Comparator<T> c) {
super(new TNode<T>(), c);
}
public SplayTreeTest() {
this(new DefaultComparator<T>());
}
public void splayIt(TNode<T> u) {
// not sure what should I do here?
// so that addItem and findItem works?
}
public boolean addItem(T x) {
TNode<T> u = newNode(x);
if (!super.add(u)) return false;
splayIt(u);
return true;
}
public T findItem(T x) {
TNode<T> u = super.findLast(x);
if (u != null)
splayIt(u);
return u != null && u.x.equals(x) ? x : null;
}
}
在我的评论中,如果您从这个八字树开始并插入5,下面是将其插入根的步骤:
2 2 2 2 2 5
/ \ / \ / \ / \ / \ / \
1 4 1 4 1 4 1 4 1 5 2 14
\ \ \ \ / \ / \ / \
14 14 14 5 4 14 1 4 6 18
/ \ / \ / \ \ / \ /
6 18 => 6 18 => 5 18 => 14 => 6 18 => 17
/ / / \ / / \ / /
17 5 17 6 17 6 18 17 15
/ / / / /
15 15 15 17 15
/
15
现在我们已经证明保持 AVL树的平衡将是一个很大的性能改进,让我们看看如何增加过程来插入一个新的键到树。由于所有新的键作为叶节点插入到树中,并且我们知道新叶的平衡因子为零,所以刚刚插入的节点没有新的要求。但一旦添加新叶,我们必须更新其父的平衡因子。这个新叶如何影响父的平衡因子取决于叶节点是左孩子还是右孩子。如果新节点是右子节点,则父节点的平衡因子将减少1。如果新节点是左子节点,则父节点的平衡因子将
我写的是testdome https://www.testdome.com/for-developers/solve-question/9708中给出的一个测试示例的答案 问题是关于二叉搜索树的: 二叉搜索树(BST)是一种二叉树,其中每个节点的值大于或等于该节点左子树中所有节点的值,而小于该节点右子树中所有节点的值。 例如,对于以下树:n1(值:1,left:null,right:null)n2
我现在正在看罗伯特·塞奇威克的算法书。在这本书中,我试图理解方法在二叉搜索树中的实现。作者用BST实现了一个符号表。作者描述方法如下: 假设我们寻找秩为k的密钥(该密钥使得BST中的其他密钥精确地k个更小)。如果左子树中的键数t大于k,则我们在左子树中(递归地)寻找秩为k的键;如果t等于k,我们返回根处的键;如果t小于k,我们在右子树中递归地寻找秩为k-t-1的键。像往常一样,这个de-scrip
我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:
编写一个函数,如果给定的二叉搜索树包含给定的值,则返回1,否则返回0。 例如,对于以下树: N1(值:1,左:null,右:null) n2(值:2,左:n1,右:n3) N3(值:3,左:null,右:null) 对contains(&n2,3)的调用应返回1,因为根位于n2的树包含编号3。 函数应该返回1,然而,它返回0或者根本不返回。
我用java编写了一个实用的二叉搜索树,除了一个关键的函数,搜索。我使用的逻辑是,我将检查根是否为空,然后我要搜索的术语是否等于根(所以返回根)或>根(所以搜索右子树)或 使用printlns查看正在发生的事情,我发现如果值在那里,它将通过正确的if语句(包括将BNode n设置为找到的值),但随后由于某种原因将再次通过方法(返回null)。 这个方法唯一起作用的时候是在搜索根节点的时候,这对我来
在二元搜索树的情况下,为什么我们不能简单地在一个节点有两个子节点的情况下,将一个节点的前一个节点替换为后一个节点?