C++ AVL二叉搜索树旋转c++;
我正在做一个avl树,我想我把一切都做好了,但我不确定这是我的右旋转功能,我做的对吗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
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,然后,必须使用新的左或右子节点(取决于节点
是其左或右子节点)更新祖父母,作为轴
。