【问题标题】:AVL binary search tree rotation c++AVL二叉搜索树旋转c ++
【发布时间】:2013-04-03 06:07:38
【问题描述】:

我正在研究一棵 avl 树,我认为我做的一切都是正确的,但我不确定这是我的右旋转功能,我做对了吗?

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

【问题讨论】:

  • 那会泄漏内存...

标签: c++ nodes


【解决方案1】:

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

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

因此,除了不必要地分配新节点并出于某种原因分配给 root 之外,您几乎是正确的。

BTW rotateRight 通常可以做成静态方法。

【讨论】:

  • 按照你的方式,如果我只有树的一侧有一些信息,我会得到内存泄漏。
  • 我的代码没有分配任何内存(不像你的那样)。如果您的代码存在内存泄漏,那是因为您的代码中的其他地方存在错误。
  • 在我像你一样更改它之前,我已经跟踪了它,它工作正常,但现在它没有
  • @john 你忘了pivot的新父母现在是它的前祖父母,如果那不是nullptr,那么祖父母必须用新的左孩子或右孩子更新(取决于是否node 是它的左或右孩子)为pivot
【解决方案2】:

我认为您的代码在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;
}

【讨论】:

  • 我的作品并没有给我任何内存泄漏。在您建议的行中。您正在将指针分配给 N 的左节点。还给出了我的指示,这就是我应该这样做的方式。
猜你喜欢
  • 2016-01-07
  • 2016-02-03
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多