我正在嘗試在 Go 中實現(xiàn)二叉樹,但目前我陷入了樹的重新平衡。重新平衡后,根節(jié)點很可能會發(fā)生變化。由于根節(jié)點是接收器類型,我必須更改接收器類型指向的值。之前的根節(jié)點現(xiàn)在被用作另一個節(jié)點,這就導(dǎo)致這個節(jié)點現(xiàn)在也是根節(jié)點的情況。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 函數(shù)中調(diào)用的。我不想公開重新平衡方法,因為它是一個實現(xiàn)細(xì)節(jié)。我想在 Add 方法中調(diào)用重新平衡方法。界面:type Store interface { Add(key string, value string) Get(key string) string Remove(key string) bool}樹節(jié)點結(jié)構(gòu):type treeNode struct { bigger *treeNode smaller *treeNode key string value string}例子重新平衡前100(根) --> 150 --> 200重新平衡后100 <-- 150(根)--> 200賦值給 *n 后... 150 <-- 150 <-- 150 --> 200如何更改接收器類型而不獲取對其自身的循環(huán)引用?
1 回答

拉丁的傳說
TA貢獻(xiàn)1789條經(jīng)驗 獲得超8個贊
你要改變的實際上是**n,所以它可以指向另一個節(jié)點。在當(dāng)前的范圍內(nèi)你不能這樣做。但是,您可以包裝該節(jié)點并將該節(jié)點設(shè)置在該方法之外,并讓該節(jié)點的方法返回一個根。
例如,
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 關(guān)注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消