我正在尝试在 Go 中实现二叉树,但目前我陷入了树的重新平衡。重新平衡后,根节点很可能会发生变化。由于根节点是接收器类型,我必须更改接收器类型指向的值。之前的根节点现在被用作另一个节点,这就导致这个节点现在也是根节点的情况。func (n *treeNode) rebalance() { sorted := n.traverseTree([]*treeNode{}) //returns a sorted array of *treeNode newRoot := innerRebalance(sorted) //the method gives the correct result *n = *newRoot//now I have a cyclic reference in the tree}重新平衡是在 add 函数中调用的。我不想公开重新平衡方法,因为它是一个实现细节。我想在 Add 方法中调用重新平衡方法。界面:type Store interface { Add(key string, value string) Get(key string) string Remove(key string) bool}树节点结构:type treeNode struct { bigger *treeNode smaller *treeNode key string value string}例子重新平衡前100(根) --> 150 --> 200重新平衡后100 <-- 150(根)--> 200赋值给 *n 后... 150 <-- 150 <-- 150 --> 200如何更改接收器类型而不获取对其自身的循环引用?
1 回答
拉丁的传说
TA贡献1789条经验 获得超8个赞
你要改变的实际上是**n,所以它可以指向另一个节点。在当前的范围内你不能这样做。但是,您可以包装该节点并将该节点设置在该方法之外,并让该节点的方法返回一个根。
例如,
type tree struct {
root *treeNode
}
func (t *tree) Remove(key string) bool {
root,ok := t.root.Remove()
t.root = root
return ok
}
并更改*treeNode.Add为func (*treeNode) Add(string) *treeNode.
- 1 回答
- 0 关注
- 84 浏览
添加回答
举报
0/150
提交
取消