可视化自平衡二叉树AVL-tree

问题描述

我已经编写了一个可视化二进制搜索树的应用程序。现在,我正在尝试对其进行修改,以可视化自平衡二进制搜索树。我有平衡方法,但是在每个节点中更新 depth index 变量时似乎存在一些问题,这些变量用于计算节点的绘制位置。在尝试了一堆不同的事情之后,代码变得很难缠住我的头,但是我怀疑有一个简单的解决方案,所以我想在这里问。

示例运行:输入节点50、60、70。树应如下所示:

60(depth = 0,index = 1,height = 1,size = 2),50(depth = 1,height=0,size = 0) and 
70(depth = 1,index = 2,height = 0,size = 0)
    60
  50  70 

但是,它看起来像这样:

50(depth = 0,size = 0)
60(depth = 1,height = 2,size = 2)
70(depth = 2,index = 4,size = 0)
50
  60
    70
public void setDrawPosition(Node node) {
        node.drawX = (node.index * DrawPanel.width) / ((int)Math.pow(2,node.depth) + 1);
        node.drawY = node.depth * DrawPanel.height / (depth+1);
    }
    
    public void addNode(int val) {
        root = addNode(val,root);
        System.out.println("tree depth is now: " + this.depth);
        root.height = this.depth;
    }

这是addNode方法:

private Node addNode(int val,Node node) { 
        if (node == null) {
            return new Node(val,1,0); // Node(int val,int depth,int size,int index,int height)
        }
        if (val < node.key) {
           node.left = addNode(val,node.left);
           node.left.depth = node.depth + 1;
           if(node.left.depth > this.depth) {
                depth = node.left.depth;
                root.height = node.left.depth;
            }
           node.left.parent = node;
           node.left.index = (node.index*2)-1;
           if (height(node.left) - height(node.right) == 2) {
               if (val < node.left.key)
                   node = rotateWithLeftChild(node);
               else
                   node = doubleWithLeftChild(node);
           }
           
        } else {
           node.right = addNode(val,node.right);
           node.right.depth = node.depth + 1;
           if(node.right.depth > this.depth) {
                depth = node.right.depth;
                root.height = node.right.depth;
            }
           node.right.parent = node;
           node.right.index = (node.index*2);
           if (height( node.right ) - height( node.left ) == 2) {
               if (val > node.right.key) 
                   node = rotateWithRightChild(node);              
               else 
                   node = doubleWithRightChild(node);
           }
        } 
        node.height = max( height( node.left ),height( node.right ) ) + 1;
        node.size++;
        return node;
    }

一种简单的轮换(它们很相似):

   private Node rotateWithRightChild(Node k1) {
       Node k2 = k1.right;
       k1.right = k2.left;
       k2.left = k1;
       k1.height = max( height( k1.left ),height( k1.right ) ) + 1;
       k2.height = max( height( k2.right ),k1.height ) + 1;
       
       return k2;
   }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)