Golang代码格式化问题如何解决

Golang代码格式化问题如何解决 这是一个简单的二叉树实现练习。代码如下:

func main() {
    fmt.Println("hello world")
}

因此我想在左子树或右子树中随机添加一个新节点。

使用这种递归方式似乎有些浪费(系统栈会增加一些开销),而且返回每个子树的头节点(第21行)也很浪费。

否则,如果我决定在左子树中添加值,我必须先检查左子树是否为空并创建它,或者对其进行递归。这种返回当前子树头节点的方式可以节省几行代码,从而使代码更简洁。

你建议我如何编写这个方法?

1 回复

更多关于Golang代码格式化问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中实现二叉树插入时,通常建议使用指针接收器方法,这样可以避免返回新的头节点,直接在原树上修改。以下是更高效的实现方式:

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

// 使用指针接收器,避免返回头节点
func (n *TreeNode) InsertRandom(val int) {
    if n == nil {
        return
    }
    
    // 随机选择左子树或右子树
    if rand.Intn(2) == 0 {
        if n.Left == nil {
            n.Left = &TreeNode{Val: val}
        } else {
            n.Left.InsertRandom(val)
        }
    } else {
        if n.Right == nil {
            n.Right = &TreeNode{Val: val}
        } else {
            n.Right.InsertRandom(val)
        }
    }
}

// 使用示例
func main() {
    rand.Seed(time.Now().UnixNano())
    
    root := &TreeNode{Val: 1}
    root.InsertRandom(2)
    root.InsertRandom(3)
    root.InsertRandom(4)
}

如果需要非递归版本以避免栈开销:

func (n *TreeNode) InsertRandomIterative(val int) {
    if n == nil {
        return
    }
    
    current := n
    for {
        if rand.Intn(2) == 0 {
            if current.Left == nil {
                current.Left = &TreeNode{Val: val}
                return
            }
            current = current.Left
        } else {
            if current.Right == nil {
                current.Right = &TreeNode{Val: val}
                return
            }
            current = current.Right
        }
    }
}

这种方法消除了递归调用,减少了系统栈的使用,同时保持了代码的清晰性。指针接收器允许直接修改树结构,无需返回新的节点引用。

回到顶部