【问题标题】:Red-Black Tree - Rotation Method Implementation - C++红黑树 - 旋转方法实现 - C++
【发布时间】:2012-11-30 17:40:15
【问题描述】:

我正在用 C++ 实现红黑树,但我的旋转方法遇到了问题。插入方法工作得很好,没有任何平衡,但是一旦我尝试旋转,我的树就会丢失信息。我的猜测是我没有以正确的方式设置指向节点的指针,但我不太明白这里到底出了什么问题。

这是我向右旋转的方法:

void RedBlackTree::rotateRight(RedBlackNode *localRoot) {
cout << "rotateRight - local root " << localRoot->data << endl;
RedBlackNode *temp = localRoot->left;
localRoot->left = temp->right;
temp->right = localRoot;
localRoot = temp;
}

我插入 c、b 和 a 就是一个例子。树最初看起来像这样:

    c
   /
  b
 /
a

旋转后,树只会打印出根节点,c。

对可能发生的事情有任何想法吗?谢谢!

【问题讨论】:

  • 我怀疑使用调试器可能会告诉你发生了什么......
  • 你需要通过引用传递localRoot指针,而不是通过值...最后一行没有效果!
  • @Caribou 我知道 Visual Studio 有一个用于运行时错误的调试器。不幸的是,我无法访问视觉。知道任何具体会有所帮助的吗?我只是在使用文本编辑器和命令行。
  • @Jordy yes windbg (msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx) 或者如果您使用的是 cygwin - gdb

标签: c++ data-structures red-black-tree tree-balancing


【解决方案1】:

根据代码段很难判断,但localRoot 是一个本地指针,它的更改在您离开函数的那一刻就被遗忘了。如果您想在调用函数的上下文中对其进行更改,您可以将其作为RedBlackNode*&amp; 传递,或者您应该将值作为结果返回。

【讨论】:

  • 我做了那个改变,但它仍然在做同样的事情。通过引用传递确实可以解决它,但它仍然存在同样的问题。
  • 你没有显示你调用你的函数。因此,无法判断出了什么问题,但我猜localRoot 也来自调用函数中的辅助指针。但是,您需要更新该指针的来源,例如树的根(如果这三个节点是整个尝试)或父节点的相应指针(如果这三个节点是某个节点的子树)。
  • 是的,你是对的。我在插入方法中调用了旋转,其中 root 作为指针传递。固定和工作。感谢您的大力帮助!
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 2021-06-27
  • 2013-11-11
  • 2013-10-13
  • 2018-11-07
  • 2012-12-24
  • 2012-08-20
相关资源
最近更新 更多