我能够编写自己的二进制搜索树,但我在如何将其转换为平衡二进制搜索树方面遇到了很多麻烦。
有人可以帮助我使用常规二叉树实现平衡二叉搜索树代码。
我认为我成功地更改了TreeNode类以进行必要的更改。
当你到达树中的3个节点时,我添加了另一个键和另一个值以及另一个TreeNode中间来保存中间指针。
然后我添加了另一个构造函数来保存案例,如果它是一个3节点。我相信我做对了。
public class TreeNode<V>
{
public int key;
public int key1;
public V value;
public V value1;
public TreeNode<V> left;
public TreeNode<V> right;
public TreeNode<V> middle;
public TreeNode(int key, V value)
{
this.key = key;
this.value = value;
this.left = null;
this.right = null;
}
public TreeNode(int key, V value, int key1, V value1)
{
this.key = key;
this.key1 = key1;
this.value = value;
this.value1 = value1;
this.left = null;
this.right = null;
this.middle = null;
}
当我需要更改实际的BST类时,很难实现。我知道put会发生很大变化,因为我们必须检查它是否是2节点或3节点,以及检查父节点是什么。
这是我到目前为止所做的:
public class BST<V>
{
private TreeNode<V> root;
public BST()
{
this.root = null;
}
public V get(int key)
{
return get(root, key);
}
private V get(TreeNode<V> current, int key)
{
if (current == null)
return null;
else if (key == current.key)
return current.value;
else if (key < current.key)
return get(current.left, key);
else
return get(current.right, key);
}
public void put(int key, V value)
{
if (root == null)
root = new TreeNode<>(key, value);
else
put(root, key, value);
}
private void put(TreeNode<V> current, int key, V value)
{
if (key == current.key)
{
current.value = value;
return;
}
else if (key < current.key)
{
if (current.left == null)
{
current.left = new TreeNode<>(key, value);
return;
}
else
put(current.left, key, value);
}
else
{
if (current.right == null)
{
current.right = new TreeNode<>(key, value);
return;
}
else
put(current.right, key, value);
}
}
}
我很难接受递归。我理解基本递归是如何工作的,但用它来实现一个平衡的二叉搜索树似乎比原先想象的要困难得多。
答案 0 :(得分:0)
你只想要一个二叉搜索树,对吗?如果是这样,那么确实不需要密钥(用于M-ary树)。
这不是一个完全答案,但希望这有助于简化您的代码至少一点。