将常规二进制搜索树转换为平衡二进制搜索树

时间:2016-02-23 17:11:57

标签: java binary-tree binary-search-tree b-tree avl-tree

我能够编写自己的二进制搜索树,但我在如何将其转换为平衡二进制搜索树方面遇到了很多麻烦。

有人可以帮助我使用常规二叉树实现平衡二叉搜索树代码。

我认为我成功地更改了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);
    }
  } 
}

我很难接受递归。我理解基本递归是如何工作的,但用它来实现一个平衡的二叉搜索树似乎比原先想象的要困难得多。

1 个答案:

答案 0 :(得分:0)

你只想要一个二叉搜索树,对吗?如果是这样,那么确实不需要密钥(用于M-ary树)。

这不是一个完全答案,但希望这有助于简化您的代码至少一点。