拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

元宝 LeetCode 116.填充每个节点的下一个右侧节点指针 Golang实现

元宝    LeetCode 116.填充每个节点的下一个右侧节点指针 Golang实现 在 Go (Golang) 中实现 LeetCode 116 非常直接。Go 使用指针操作对象没有 Rust 那样的所有权负担也没有 Python/Kotlin 那样的类继承体系直接通过结构体指针修改“Next” 字段即可。以下提供 迭代法 和 递归法 两种 Golang 实现。前置LeetCode 中的 Node 定义LeetCode 已内置无需提交type Node struct {Val intLeft *NodeRight *NodeNext *Node}方法一迭代法O(1) 空间推荐利用上一层已经连接好的“Next” 指针横向遍历并连接下一层的子节点。func connect(root *Node) *Node {if root nil {return nil}// leftmost 指向每一层的最左节点 leftmost : root // 只要当前层不是叶子层即还有下一层 for leftmost.Left ! nil { // head 用于遍历当前层的节点 head : leftmost for head ! nil { // 1. 同一个父节点左孩子 - 右孩子 head.Left.Next head.Right // 2. 不同父节点右孩子 - 下一个节点的左孩子 if head.Next ! nil { head.Right.Next head.Next.Left } // 沿着 next 指针移动到当前层下一个节点 head head.Next } // 进入下一层最左边的节点 leftmost leftmost.Left } return root}方法二递归法简洁直观利用递归栈隐式完成层序遍历代码更短。func connect(root *Node) *Node {if root nil {return nil}// 如果有左子树完美二叉树有左必有右 if root.Left ! nil { // 左孩子指向右孩子 root.Left.Next root.Right // 如果当前节点有 next右孩子指向下一个节点的左孩子 if root.Next ! nil { root.Right.Next root.Next.Left } // 递归处理左右子树 connect(root.Left) connect(root.Right) } return root}Golang 实现要点解析指针操作Go 的结构体指针可以直接用“.” 访问字段如“head.Left.Next”不需要“-” 运算符语法上非常简洁。nil 判断Go 中没有“Option” 或“?” 语法糖直接用“ nil” 或“! nil” 判断空指针逻辑清晰。无构造函数负担不需要像 C 那样管理内存也不需要像 Rust 那样“borrow_mut”直接赋值即可“head.Left.Next head.Right”。函数签名LeetCode 要求实现“func connect(root *Node) *Node”直接返回“root” 即可。复杂度分析时间复杂度O(N)每个节点仅访问一次。空间复杂度迭代法O(1)只使用固定数量的指针变量。递归法O(log N)递归调用栈深度完美二叉树的高度。你可以直接把“func connect” 复制到 LeetCode Golang 编辑器提交。需要我帮你把这段代码改成 LeetCode 117普通二叉树 的 Golang 版本或者对比一下 Golang 和 Rust/Kotlin 实现上的核心差异 吗
返回列表