繁体   English   中英

旋转AVL树节点会导致节点消失

[英]Rotation of AVL Tree nodes results in nodes disappearing

我试图用Java编写AVL树,并且在此上停留了两个晚上。 当运行以下代码时,当然会发生旋转,但是例如说leftRotate的最终结果是我丢失了节点。

public AVLNode leftRotate(AVLNode node){ //receives the grandparent node
    AVLNode temp = node.right;
    node.right = temp.left;
    temp.left = node;

    return temp;    
}

public AVLNode rightRotate(AVLNode node){
    AVLNode temp = node.left;
    node.left = temp.right;
    temp.right = node;

    return temp;
}

public AVLNode rightLeftRotate(AVLNode node){
    node.right = rightRotate(node.right);
    return leftRotate(node);
}

public AVLNode leftRightRotate(AVLNode node){
    node.left = leftRotate(node.left);
    return rightRotate(node);
}

如果我向左右旋转方法添加root = temp ,则旋转和新显示仅在第一次旋转时成功发生,然后所有东西混合在一起。

示例:先插入4、5,然后再插入6。旋转之后, temp保持5作为其“根”,正确包含4和6作为其左右子项的键。 但是,方法结束后所有这些都消失了,并且树根的左右子级现在为空。

我知道我想念的东西很小,但我无法将它包裹住。

我还知道这不是我的addNode函数,因为完成所有节点的添加后,无论如何,结果树都是二叉搜索树。 只有在调用这些函数时,我才开始丢失节点。 有什么帮助吗?

我认为这是一个如何管理内存的问题,而不是AVLNode temp = node.left; or AVLNode temp = node.left; AVLNode temp = node.left; or AVLNode temp = node.left; 实例化一个新的AVLNode并复制信息,因此您没有指向先前对象的指针。 发生的是,当您执行AVLNode时,temp = node.left;。 temp是指向node.left的指针,因此,如果返回temp,则所有更改和旋转都将对原始节点进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM