【发布时间】:2021-02-21 19:13:25
【问题描述】:
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:140
main.(*bt).topview(0xc000072f60)
/Users/pulkitkundra/work/hackerrank/golang-30/tree.go:100 +0x32f
main.main()
/Users/pulkitkundra/work/hackerrank/golang-30/tree.go:126 +0x108
exit status 2
我试图将删除线放在延迟中,然后它卡住了。 如果我不删除它进入无限循环的元素。 我正在尝试实现 BST 的顶视图代码。 不希望以其他方式创建队列。
【问题讨论】:
-
我认为
qu.Front()会在列表为空时返回nil(即,一旦您删除了所有元素)。循环条件 (for qu != nil {) 永远不会满足,因为qu永远不会是nil。你应该循环“直到列表不为空”:for qu.Len() > 0 {. -
再做一些调整,谢谢。也请发布您的答案。
-
我添加了答案,如果有帮助,请采纳:)
标签: go queue runtime-error