我一直在研究 Golang,并一直在实施一些数据结构来了解该语言的工作原理。我在为 AVL 树编写代码时遇到了以下问题:
从结构指针方法分配主指针似乎在函数范围之外没有任何影响。例如tree.rotateLeftToRoot(),不会导致tree.left成为新树。
问题:有没有办法在 Golang 中的 struct 指针方法中重新分配指针,或者这通常是不鼓励的?在示例中,这将是该"tree = prevLeft"行。
代码片段:
//Graphical representation of t.rotateLeftToRoot():
// t L
// L R -> LL t
//LL LR LR R
func (tree *AvlTree) rotateLeftToRoot() {
if tree == nil {
return
}
prevLeft := tree.left
if prevLeft != nil {
tree.left = prevLeft.right //tree.left passed root its right branch
prevLeft.right = tree //tree becomes tree.left's right branch
tree.updateHeight()
prevLeft.updateHeight()
tree = prevLeft //desired behaviour: tree.left becomes the new tree
//actual behaviour: no effect when function returns
}
}
我尝试了设置树的值或地址的其他组合,但都没有达到预期的效果。例如,*tree = *prevLeft导致无限循环。
附加说明:返回tree和设置"tree = tree.rotateLeftToRoot()"可避免此问题。这是可行的,但是当调用者真的只想能够调用一个函数来更新树时,混合效果并需要分配给返回值似乎很脏。
可以在函数内tree设置为prevLeftfrom 吗?
芜湖不芜
相关分类