【问题标题】:Updating AVL Tree Problem更新 AVL 树问题
【发布时间】:2011-05-02 03:53:48
【问题描述】:

到目前为止,我只致力于实现同侧 AVL 树更新。

我遇到的问题是在二叉搜索树通过 AVL 重新排序后,我的显示功能崩溃了。我相应地移动了指针,但是当函数中断时,插入了另一个对象,我无法终生调试它。任何帮助将不胜感激。

AVLTree tree = new AVLTree(3)
tree.insert(2);
tree.insert(1); //causes the problem
tree.print();

这是我的 AVLTree 类

public class AVLTree {

private boolean verboseMode = true;

private Comparable data;
private AVLTree left, right, parent;
private int rightHeight = -1, leftHeight = -1;

public AVLTree(Comparable obj){
    data = obj; left = null; right = null; parent = null;
}

private AVLTree(Comparable obj, AVLTree l, AVLTree r, AVLTree p){
    data = obj; left = l; right = r; parent = p;
}



public void insert(Comparable obj){
    int compare = obj.compareTo(data);
    if(compare != 0)
        if(compare < 0)
            if(left == null){
                left = new AVLTree(obj, null, null, this);
                // comment out for standard BST //
                left.updateHeight();            //
                left.updateBalance();           //
                // ///////////////////////////////
            } else
                left.insert(obj);
        else
            if(right == null){
                right = new AVLTree(obj, null, null, this);
                // comment out for standard BST //
                right.updateHeight();           //
                right.updateBalance();          //
                // ///////////////////////////////
            } else
                right.insert(obj);
    else
        System.err.printf("Object '%o' already in tree\n", obj);
}

public void updateHeight(){
    if(this.parent != null){
        if(this == this.parent.left)
            this.parent.leftHeight += 1;
        if(this == this.parent.right)
            this.parent.rightHeight += 1;
        this.parent.updateHeight();
    }
}

public void updateBalance(){
    if(this.parent != null){
        int diff = this.parent.leftHeight - this.parent.rightHeight;
        if(diff > 1 || diff < -1){
            if(this.parent.leftHeight > this.parent.rightHeight){
                AVLTree t0 = this.parent.parent;
                AVLTree t1 = this.parent;
                AVLTree t3 = this.parent.right;
                AVLTree t4 = this.right;
                this.right = t1;
                this.right.parent = this;
                if(t0 == null)
                    this.parent = null;
                else {
                    if(this == this.parent.left){
                        this.parent = t0;
                        this.parent.left = this;
                    } else {
                        this.parent = t0;
                        this.parent.right = this;
                    }
                }
                if(t4 == null)
                    this.right.left = null;
                else {
                    this.right.left = t4;
                    this.right.left.parent = this.right;
                }
                if(t3 == null)
                    this.right.right = null;
                else {
                    this.right.right = t3;
                    this.right.right.parent = this.right;
                }
            }               
        } else
            this.parent.updateBalance();
    }           
}       

public void print(){
    String loc = ""; print(loc);
} 
public void print(String loc){
    if(this.left != null){
        String tempLoc = loc+"0";
        left.print(tempLoc);
    }
    if(this.right != null){
        String tempLoc = loc+"1";
        right.print(tempLoc);
    }
    if(!verboseMode){
        System.out.printf("%s[%s], ", data, loc);
    } else
        System.out.printf("%s[%s] \t[%d, %d]\n\n", data, loc, leftHeight, rightHeight);         
}

}

【问题讨论】:

    标签: java recursion avl-tree


    【解决方案1】:

    您的问题如下: 当您拨打电话时 tree.insert(1); //causes the problem 您将树打乱,顶部/根节点被更改/重新排列; 但是您的 tree 变量在重新排列树之前指向旧根。所以你的代码完全按照你告诉它的去做。

    你可以把这个方法传给类:

    公共 AVLTree getRoot() {

        if(parent != null) {
           return parent.getRoot();
        } else {
           return this;
        }
    }
    

    并创建以下 main() 函数:

      public static void main(String[] args) {     
        AVLTree tree = new AVLTree(3);
        System.out.println(tree.getRoot());
        tree.insert(2);
        System.out.println(tree.getRoot());
        tree.insert(1); //causes the problem
        System.out.println(tree.getRoot());
        tree.getRoot().print();
        tree.print();
      }
    

    运行的示例输出如下:

    AVLTree@47b480
    AVLTree@47b480
    AVLTree@9b49e6
    1[0]  [-1, -1]
    3[1]  [1, -1]
    2[]   [0, -1]
    3[]   [1, -1] //this comes from the second call to print
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2011-02-26
      相关资源
      最近更新 更多