Go中序遍历访问nil指针报错?Python逻辑迁移Go不生效原因
Go版本中序遍历异常原因分析
1. 切片传参逻辑和Python差异
Python中的列表是可变引用类型,递归函数内执行append操作会直接修改原列表,不需要接收返回值即可生效。
而Go的切片是值传递类型,append操作如果触发底层数组扩容,会返回全新的切片对象。你第一版Go代码中调用左右子树的InOrderTraverse方法时完全没有接收返回值,子树遍历的结果无法同步到当前函数的array变量中,最终返回结果只会包含当前节点的值,完全丢失子树遍历数据。
你修复后的代码增加了array = tree.Left.InOrderTraverse(array)的赋值操作,将递归返回的新切片同步到当前变量,正确保留了所有遍历结果。
2. nil指针接收者的调用逻辑
Go允许使用nil的指针类型作为方法接收者,只要方法内部处理了nil的判断逻辑就不会触发panic。你第一版代码已经在方法入口写了if tree == nil {return nil},理论上直接在nil的*BST指针上调用方法不会报错。你之前遇到的nil指针报错,大概率是根节点未初始化或其他BST构造逻辑异常导致的。
你修复后的代码额外增加了调用前的tree.Left != nil判断,提前规避了无意义的nil接收者调用,写法更严谨。
内容的提问来源于stack exchange,提问作者preordertraverser
相关产品推荐
相关产品推荐

