Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ AVL二叉搜索树旋转c++;_C++_Nodes - Fatal编程技术网

C++ AVL二叉搜索树旋转c++;

C++ AVL二叉搜索树旋转c++;,c++,nodes,C++,Nodes,我正在做一个avl树,我想我把一切都做好了,但我不确定这是我的右旋转功能,我做的对吗 Node* BinaryTree::rotateRight(Node *N) { Node *newNode = new Node(); newNode = N->getLeft(); N->setLeft(newNode->getRight()); newNode->setRight(N); root = newNode; return

我正在做一个avl树,我想我把一切都做好了,但我不确定这是我的右旋转功能,我做的对吗

Node* BinaryTree::rotateRight(Node *N)
{
    Node *newNode = new Node();
    newNode = N->getLeft();
    N->setLeft(newNode->getRight());
    newNode->setRight(N);
    root = newNode;
    return newNode;
}

我认为您的代码可能会在
newNode=N->getLeft()之后产生内存泄漏

这是我的实现,我直接写在这里。你可以检查它是否正确。我还没有测试

Node* BinaryTree::rotateRight(Node *N)
{
    Node *newNode = new Node();
    Node *prevLeft = N->getLeft();

    prevLeft->setRight(newNode);
    newNode->setLeft(prevLeft);
    newNode->setRight(N);
    N->setLeft(newNode);

    root = newNode;
    return newNode;
}

rotateRight不需要分配新节点。它只通过操纵指向现有节点的指针来工作。像这样

Node* BinaryTree::rotateRight(Node *N)
{
    Node *pivot = N->getLeft();
    N->setLeft(pivot->getRight());
    pivot->setRight(N);
    return pivot;
}
除了不必要地分配一个新节点,以及出于某种原因分配给root之外,您几乎是对的


顺便说一句,rotateRight通常是一种静态方法。

这会导致内存泄漏……我的工作正常,不会给我任何内存泄漏。按照你建议的路线。您正在将指针分配给N的左节点。同时给出了我的指令,这就是我应该如何做的。按照您的方式,如果我只在树的一侧有一些信息,我就会出现内存泄漏。我的代码不会分配任何内存(不像您的代码那样)。如果我的代码出现内存泄漏,那是因为代码中的其他地方有一个bug。在我将其更改为您的代码之前,我已经找到了该方法。它工作正常,但现在没有@john您忘记了
pivot
的新父母现在是它的前祖父母,如果不是nullptr,然后,必须使用新的左或右子节点(取决于
节点
是其左或右子节点)更新祖父母,作为