亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從隊列中刪除元素時出錯

從隊列中刪除元素時出錯

Go
慕森卡 2022-08-09 20:38:40
func (t *bt) topview() {    if t.root == nil {        return    }    qu := list.New()    topview := make(map[int]*tree)    qu.PushBack(top{t.root, 0})    //fmt.Println(sample.Value.(top).hd)    fmt.Println("top view")    for qu != nil {        sample := qu.Front()        qu.Remove(qu.Front())        for key := range topview {            if key != sample.Value.(top).hd {                topview[sample.Value.(top).hd] = sample.Value.(top).node            }        }        if sample.Value.(top).node.left != nil {            qu.PushBack(top{sample.Value.(top).node.left, sample.Value.(top).hd - 1})        }        if sample.Value.(top).node.right != nil {            qu.PushBack(top{sample.Value.(top).node.right, sample.Value.(top).hd + 1})        }    }    for _, value := range topview {        fmt.Println(value)    }}我得到的這個錯誤panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x109e1cf]goroutine 1 [running]:container/list.(*List).Remove(...)    /usr/local/go/src/container/list/list.go:140main.(*bt).topview(0xc000072f60)    /Users/pulkitkundra/work/hackerrank/golang-30/tree.go:100 +0x32fmain.main()    /Users/pulkitkundra/work/hackerrank/golang-30/tree.go:126 +0x108exit status 2我試圖將刪除行放在延遲中,然后它被卡住了。如果我不刪除元素,它就會進入無限循環。我正在嘗試實現BST的頂視圖代碼。不尋求以其他方式創建隊列。
查看完整描述

2 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

緊急錯誤是由線路引起的

qu.Remove(qu.Front())

因為元素傳遞給了 qu。Remove() 是,發生這種情況是因為 qu.Front() 在列表為空時返回(即刪除所有元素后)nilnil

循環條件

for qu != nil {

是錯誤的,因為它永遠不會被滿足,因為它永遠不會被滿足。qunil

循環應該“直到列表不為空”,即:

for qu.Len() > 0 {

這將防止返回,進而將其傳遞給并導致緊急錯誤。qu.Front()nilqu.Remove()


查看完整回答
反對 回復 2022-08-09
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

func (t *bt) topview() {

    if t.root == nil {

        return

    }

    qu := list.New()

    topview := make(map[int]*tree)

    qu.PushBack(top{t.root, 0})

    topview[qu.Front().Value.(top).hd] = qu.Front().Value.(top).node

    //fmt.Println(sample.Value.(top).hd)

    fmt.Println("top view")

    for qu.Len() > 0 {

        sample := qu.Front()

        qu.Remove(qu.Front())

        for key := range topview {

            if key != sample.Value.(top).hd {

                topview[sample.Value.(top).hd] = sample.Value.(top).node

            }

        }

        if sample.Value.(top).node.left != nil {

            qu.PushBack(top{sample.Value.(top).node.left, sample.Value.(top).hd - 1})

        }

        if sample.Value.(top).node.right != nil {

            qu.PushBack(top{sample.Value.(top).node.right, sample.Value.(top).hd + 1})

        }

    }

    for _, value := range topview {

        fmt.Println(value.data)

    }


}


查看完整回答
反對 回復 2022-08-09
  • 2 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號