平衡二叉搜索树

时间:2020-10-21 13:01:35

标签: java recursion binary-search-tree

我正在尝试用Java实现二进制搜索树类,该方法可以在高度不同时重新平衡树。我正在尝试通过首先将节点的值存储在List(类的属性)中来做到这一点。

然后,我想获取此列表的中间元素,并将其分配给树的根。此后,我将列表的左,右部分作为对象,然后对根的左,右子代递归执行相同的操作,等等。

我的算法似乎无法正常运行,而且我不明白自己在做什么错。我想知道是否有人可以看一下我的代码并解释问题所在?我要做的基本上是将树的元素(类的属性)和根的有序列表传递到下面的函数中:

public void build(BinaryNode<E> n,List<E> list) {
    int idx = (int)Math.floor(list.size()/2);
    if(n!=null) {
        n.element = list.get(idx);
    } else if(n==null) {
        n = new BinaryNode<E>(list.get(idx));
    }

    if(!list.subList(0,idx).isEmpty()) {
        build(n.left,list.subList(0,idx));
    } 

    if(!list.subList(idx+1,list.size()).isEmpty() ){
        build(n.right,list.subList(idx+1,list.size()));
    }
    return;
}

亲切的问候,

2 个答案:

答案 0 :(得分:1)

Java方法调用是“按值调用”。这意味着更改参数(在您的情况下为n)在方法之外无效。

尝试这样定义您的方法

public BinaryNode<E> build(List<E> list) { ... }

答案 1 :(得分:1)

尝试调查有关AVL树的信息

一些有用的链接: https://en.wikipedia.org/wiki/AVL_tree https://www.geeksforgeeks.org/avl-tree-set-1-insertion/