我正在构建一个AVL树程序。我陷入了相当容易的困境,但很难理解什么是错的。我之所以认为这是程序的错,而不是我的错,是因为我之前有" left"和"对"交换,它工作得很好......
如您所见,该函数返回temproot
指针,如果temp2
,则指针等于root==temp
。有趣的是,虽然当我在返回它之前测试打印temproot
JUST的值(在我的例子中是15)时,返回的实际值是STILL 20({{的前一个值) 1}})。我三重检查了一切。它似乎没有返回新获得的价值......可能是什么问题?
更具体地说,确切的代码是:
temproot
答案 0 :(得分:0)
我没有看到您所看到的功能存在问题。
指针以不同于典型对象(值)的方式工作,如果没有手绘板,很难解释,但让我试试。
当你"记得"最初在节点中传递的指针,你只记得那个。即使你将初始指针分配给不同的结构字段,"移动它",你的"复制"仍将指向完全相同的元素,因为在分配/重新分配指针时实际内存不会移动。而且,正因为如此(在你的情况下),你正在做的旋转,不会被最初传入的根的父元素反映,因为它仍然指向被分配给的同一个元素。 temp2-> left(就像temproot一样,因为实际的内存没有被重新分配)。
如果要更改(有权访问)存储实际元素的位置。我假设在你的情况下,你需要通过引用传递旋转的根元素(avlnode * Tree :: RL_rotation(avlnode *& temp))。通过这样做,您将不仅传递您想要进行旋转的节点的内存位置,而且还传递位置的位置。这将允许在旋转之后更改根,这是您之前无法做到的。
注意:摆脱这样的代码: avlnode * temp1 = new avlnode; temp1目录= TEMP->权;
您正在创建一个新的内存位置,您会立即忘记它,并且它永远不会被释放(在本机C ++中没有垃圾收集器)。
相反,写这样(因为你不需要创建新节点 - 你只是重新安排它们): avlnode * temp1 = temp-> right;