所以我試圖通過索引檢索最小堆樹中的節點。調用它的方式是我會啟動一個空的 MinHeapNode 結構并通過它的值傳遞,&node以便在遞歸函數調用之間,如果找到匹配項,它將返回。然而,即使給出找到的結果,新分配的空節點似乎也會被另一個具有該節點空版本的遞歸調用覆蓋。我仍然習慣了指針和地址的想法,所以我相信傳遞值地址可以解決這個問題,因為它會在調用之間的相同地址調用相同的值。但顯然這是不正確的。type MinHeapNode struct { Parent *MinHeapNode Left *MinHeapNode Right *MinHeapNode Value int Index int}func (MHN *MinHeapNode) Insert(value int) { if !MHN.hasLeftChild() { MHN.Left = &MinHeapNode{Parent: MHN, Value: value} return } if !MHN.hasRightChild() { MHN.Right = &MinHeapNode{Parent: MHN, Value: value} return } if MHN.hasLeftChild(){ MHN.Left.Insert(value) return } if MHN.hasRightChild(){ MHN.Right.Insert(value) return }}func (MHN *MinHeapNode) setIndex(count *int){ index := *count *count = *count +1 MHN.Index = index if MHN.hasLeftChild(){ MHN.Left.setIndex(count) } if MHN.hasRightChild(){ MHN.Right.setIndex(count) } }func (MHN *MinHeapNode) getIndex(index int, node *MinHeapNode){ if MHN == nil{ return } if MHN.Index == index{ node = MHN return } MHN.Left.getIndex(index, node) MHN.Right.getIndex(index,node) }}type MinHeapTree struct { Root MinHeapNode Size int}func (MHT *MinHeapTree) getIndex(index int)(*MinHeapNode, error){ if MHT.Size < index +1 { err := fmt.Errorf("index exceeds tree size") return nil, err } var node MinHeapNode MHT.Root.getIndex(index, &node) return &node, nil}
1 回答

哆啦的時光機
TA貢獻1779條經驗 獲得超6個贊
您面臨的問題似乎與中的聲明node = MHN有關getIndex(但由于您的代碼不完整,我無法確認這是否是唯一的問題)。
node = MHN將更新node(一個參數,所以按值傳遞,它的作用域是函數體)的值。MinHeapNode這對函數node開頭指向的值沒有影響。糾正這個用法*node = *MHN。
這可以用一個簡單的程序(操場)來演示
type MinHeapNode struct {
Test string
}
func getIndexBad(node *MinHeapNode) {
newNode := MinHeapNode{Test: "Blah"}
node = &newNode
}
func getIndexGood(node *MinHeapNode) {
newNode := MinHeapNode{Test: "Blah"}
*node = newNode
}
func main() {
n := MinHeapNode{}
fmt.Println(n)
getIndexBad(&n)
fmt.Println(n)
getIndexGood(&n)
fmt.Println(n)
}
輸出表明“壞”函數不會更新傳入的node:
{}
{}
{Blah}
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報
0/150
提交
取消