package main
import "fmt"
type Node struct {
Val int
Left *Node
Right *Node
Next *Node
}
func connect1(root *Node) *Node {
if root == nil {
return nil
}
queue := []*Node{root}
for len(queue) > 0 {
size := len(queue)
for i := 0; i < size; i++ {
node := queue[0]
queue = queue[1:]
if i < size-1 {
node.Next = queue[0]
}
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
}
return root
}
func connect2(root *Node) *Node {
if root == nil {
return nil
}
if root.Left != nil {
root.Left.Next = root.Right
}
if root.Right != nil && root.Next != nil {
root.Right.Next = root.Next.Left
}
connect2(root.Left)
connect2(root.Right)
return root
}
func connect3(root *Node) *Node {
if root == nil {
return nil
}
leftmost := root
for leftmost.Left != nil {
curr := leftmost
for curr != nil {
curr.Left.Next = curr.Right
if curr.Next != nil {
curr.Right.Next = curr.Next.Left
}
curr = curr.Next
}
leftmost = leftmost.Left
}
return root
}
func connect4(root *Node) *Node {
if root == nil {
return nil
}
if root.Left != nil {
root.Left.Next = root.Right
if root.Next != nil {
root.Right.Next = root.Next.Left
}
}
connect4(root.Left)
connect4(root.Right)
return root
}
func arrayToTreeLevelOrder(arr []interface{}) *Node {
if len(arr) == 0 || arr[0] == nil {
return nil
}
root := &Node{Val: arr[0].(int)}
queue := []*Node{root}
i := 1
for i < len(arr) && len(queue) > 0 {
node := queue[0]
queue = queue[1:]
if i < len(arr) && arr[i] != nil {
left := &Node{Val: arr[i].(int)}
node.Left = left
queue = append(queue, left)
}
i++
if i < len(arr) && arr[i] != nil {
right := &Node{Val: arr[i].(int)}
node.Right = right
queue = append(queue, right)
}
i++
}
return root
}
func validateNextPointers(root *Node) []string {
if root == nil {
return []string{}
}
var result []string
leftmost := root
for leftmost != nil {
curr := leftmost
level := []int{}
for curr != nil {
level = append(level, curr.Val)
curr = curr.Next
}
levelStr := ""
for i, v := range level {
if i > 0 {
levelStr += " -> "
}
levelStr += fmt.Sprintf("%d", v)
}
result = append(result, levelStr)
leftmost = leftmost.Left
}
return result
}
func levelOrderWithNext(root *Node) []interface{} {
if root == nil {
return []interface{}{}
}
var result []interface{}
leftmost := root
for leftmost != nil {
curr := leftmost
for curr != nil {
result = append(result, curr.Val)
curr = curr.Next
}
result = append(result, "#")
leftmost = leftmost.Left
}
return result
}
func equal(a, b []interface{}) bool {
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}
func main() {
fmt.Println("=== LeetCode 116: 填充每个节点的下一个右侧节点指针 ===\n")
testCases := []struct {
name string
root *Node
expected []interface{}
}{
{name: "空树", root: arrayToTreeLevelOrder([]interface{}{}), expected: []interface{}{}},
{name: "单节点", root: arrayToTreeLevelOrder([]interface{}{1}), expected: []interface{}{1, "#"}},
{name: "两层树", root: arrayToTreeLevelOrder([]interface{}{1, 2, 3}), expected: []interface{}{1, "#", 2, 3, "#"}},
{name: "三层完美二叉树", root: arrayToTreeLevelOrder([]interface{}{1, 2, 3, 4, 5, 6, 7}), expected: []interface{}{1, "#", 2, 3, "#", 4, 5, 6, 7, "#"}},
{name: "四层完美二叉树", root: arrayToTreeLevelOrder([]interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}), expected: []interface{}{1, "#", 2, 3, "#", 4, 5, 6, 7, "#", 8, 9, 10, 11, 12, 13, 14, 15, "#"}},
}
methods := []struct {
name string
fn func(*Node) *Node
}{
{"方法一:BFS 层序遍历", connect1},
{"方法二:递归连接", connect2},
{"方法三:迭代 O(1) 空间", connect3},
{"方法四:DFS 前序遍历", connect4},
}
allPassed := true
for _, method := range methods {
fmt.Printf("--- %s ---\n", method.name)
passed := 0
for i, tc := range testCases {
testRoot := arrayToTreeLevelOrder(getTreeArray(tc.name))
result := method.fn(testRoot)
got := levelOrderWithNext(result)
if equal(got, tc.expected) {
fmt.Printf(" Test %d: ✓ PASSED\n", i+1)
passed++
} else {
fmt.Printf(" Test %d: ✗ FAILED\n", i+1)
fmt.Printf(" 输入:%v\n", getTreeArray(tc.name))
fmt.Printf(" 期望:%v\n", tc.expected)
fmt.Printf(" 得到:%v\n", got)
allPassed = false
}
}
fmt.Printf("通过率:%d/%d\n\n", passed, len(testCases))
}
if allPassed {
fmt.Println("🎉 所有测试通过!")
} else {
fmt.Println("❌ 部分测试失败")
}
}
func getTreeArray(name string) []interface{} {
switch name {
case "空树":
return []interface{}{}
case "单节点":
return []interface{}{1}
case "两层树":
return []interface{}{1, 2, 3}
case "三层完美二叉树":
return []interface{}{1, 2, 3, 4, 5, 6, 7}
case "四层完美二叉树":
return []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
default:
return []interface{}{}
}
}