我想要一些关于 Go 指针接收器如何工作的帮助。我有一个二叉搜索树的包含示例,希望可以帮助我解释。package mainimport "fmt"type Node struct { key int left, right *Node}func NewNode(key int) *Node { return &Node{key, nil, nil}}type BST struct { root *Node}func NewBinarySearchTree() *BST { return &BST{nil}}func (t *BST) Insert(key int) { if t.root == nil { t.root = NewNode(key) return } var node = t.root for { if key < node.key { if node.left == nil { node.left = NewNode(key) return } else { node = node.left } } else { if node.right == nil { node.right = NewNode(key) return } else { node = node.right } } }}func inorder(node *Node) { if node == nil { return } inorder(node.left) fmt.Print(node.key, " ") inorder(node.right)}func main() { tree := NewBinarySearchTree() tree.Insert(3) tree.Insert(1) tree.Insert(2) tree.Insert(4) inorder(tree.root) // 1 2 3 4}然而,在我写完之后,我想我可以将我的插入函数简化如下:func (t *BST) Insert2(key int) { var node *Node node = t.root for node != nil { if key < node.key { node = node.left } else { node = node.right } } node = NewNode(key)}但是,这样做树永远不会更新。我的想法是...在第一次插入时,根节点将为 nil。所以引用 t.root 的局部变量节点也将为 nil因此将跳过 for 循环。node = NewNode(key) 将具有相同的效果 t.root =
NewNode(key)我的 Insert2 方法哪里出错了?有没有办法可以调整?
2 回答
侃侃尔雅
TA贡献1801条经验 获得超16个赞
您似乎混淆了指针的使用。
当你这样做时node = t.root,你只是node指向任何t.root指向的东西。
稍后,当您这样做时node = NewNode(key),您会node指向一个新创建的项目,这不是您想要的;您想改为t.root指向该新项目。
由于您打算修改类型为*Node( root,left和right) 的变量,因此我们需要一个指向它们的指针,因此类型为 的变量**Node具有更高的间接级别。
您可以通过启动node点的地址t.root,node := &t.root,然后你继续你的循环。
您可以尝试以下操作:
func (t *BST) Insert3(key int) {
node := &t.root
for *node != nil {
if key < (*node).key {
node = &(*node).left
} else {
node = &(*node).right
}
}
*node = NewNode(key)
}
注意我们使用间接运算符*来访问引用的数据,在检查循环上的地址时,还有键。
在函数的最后,*node = NewNode(key)做你原本打算做的事情;您将新创建的项目分配给根指针、左指针或右指针。
- 2 回答
- 0 关注
- 189 浏览
添加回答
举报
0/150
提交
取消