问题描述
我已经编写了一个可视化二进制搜索树的应用程序。现在,我正在尝试对其进行修改,以可视化自平衡二进制搜索树。我有平衡方法,但是在每个节点中更新 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 (将#修改为@)