为什么我的 Go 指针接收器不会导致更新?

我想要一些关于 Go 指针接收器如何工作的帮助。


我有一个二叉搜索树的包含示例,希望可以帮助我解释。


package main


import "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 方法哪里出错了?有没有办法可以调整?


明月笑刀无情
浏览 195回答 2
2回答

侃侃尔雅

您似乎混淆了指针的使用。当你这样做时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) {&nbsp; &nbsp; node := &t.root&nbsp; &nbsp; for *node != nil {&nbsp; &nbsp; &nbsp; &nbsp; if key < (*node).key {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; node = &(*node).left&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; node = &(*node).right&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; *node = NewNode(key)}注意我们使用间接运算符*来访问引用的数据,在检查循环上的地址时,还有键。在函数的最后,*node = NewNode(key)做你原本打算做的事情;您将新创建的项目分配给根指针、左指针或右指针。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go