java - AVL Tree节点旋转导致节点消失

标签 java tree nodes

我正在尝试用 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 作为其值 “root”,正确包含 4 和 6 作为其左子节点和右子节点的键。然而,在方法结束后,所有这些都会消失,并且我的树根的左右子节点现在为空。

我知道我错过了一些小事,但我无法理解它。

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

最佳答案

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

关于java - AVL Tree节点旋转导致节点消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46376412/

相关文章:

java - 如何正确实现类继承,在java neo4j中注释为@QueryResult

java - android/java中的校验和计算

c - 使树水平生长,对当前节点应用修改

java - 正确地从树中删除节点

javascript - jQuery 定位元素的几个层次

javascript - 如何使用 javascript 获取 Element 对象数组

java - 如何在 Gmail 中获取转发给外部用户的邮件的邮件附件?

Java LinkedList添加多个节点

java - 如何创建一个程序,通过 A* 搜索来解决所有在一个 Java 源文件中的 8 个难题?

java - Android 和 Eclipse 将现有应用程序复制到新项目创建一个有趣的 R.*