From 12e2ab5e0f86882e21ff39ef242d8f590bd41abc Mon Sep 17 00:00:00 2001 From: "legolas.zhan" Date: Mon, 2 Dec 2024 17:11:37 +0800 Subject: [PATCH 1/2] 117. Populating Next Right Pointers in Each Node II --- leetcode/others/connect.go | 34 ++++++++++++++ leetcode/others/connect_test.go | 79 +++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 leetcode/others/connect.go create mode 100644 leetcode/others/connect_test.go diff --git a/leetcode/others/connect.go b/leetcode/others/connect.go new file mode 100644 index 00000000..8d5b5eba --- /dev/null +++ b/leetcode/others/connect.go @@ -0,0 +1,34 @@ +package lothers + +type Node struct { + Val int + Left *Node + Right *Node + Next *Node +} + +func connect(root *Node) *Node { + if root == nil { + return nil + } + + queue := []*Node{root} + for len(queue) > 0 { + levelSize := len(queue) + for i := 0; i < levelSize; i++ { + node := queue[i] + if i < levelSize-1 { + node.Next = queue[i+1] + } + + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + queue = queue[levelSize:] + } + return root +} diff --git a/leetcode/others/connect_test.go b/leetcode/others/connect_test.go new file mode 100644 index 00000000..f69f7a39 --- /dev/null +++ b/leetcode/others/connect_test.go @@ -0,0 +1,79 @@ +package lothers + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestConnect(t *testing.T) { + tests := []struct { + name string + root *Node + expected []interface{} + }{ + { + name: "Example 1", + root: &Node{ + Val: 1, + Left: &Node{ + Val: 2, + Left: &Node{ + Val: 4, + }, + Right: &Node{ + Val: 5, + }, + }, + Right: &Node{ + Val: 3, + Right: &Node{ + Val: 7, + }, + }, + }, + expected: []interface{}{1, "#", 2, 3, "#", 4, 5, 7, "#"}, + }, + { + name: "Example 2", + root: nil, + expected: []interface{}{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + root := connect(tt.root) + + // Serialize the tree and check the result + result := serializeTree(root) + assert.Equal(t, tt.expected, result) + }) + } +} + +func serializeTree(root *Node) []interface{} { + if root == nil { + return []interface{}{} + } + queue := []*Node{root} + var result []interface{} + for len(queue) > 0 { + levelSize := len(queue) + for i := 0; i < levelSize; i++ { + node := queue[i] + result = append(result, node.Val) + if i == levelSize-1 { + result = append(result, "#") + } + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + queue = queue[levelSize:] + } + return result +} From ae26ea48fd7588c2c1632968fe76fdde19b4ffa0 Mon Sep 17 00:00:00 2001 From: "legolas.zhan" Date: Mon, 2 Dec 2024 17:15:44 +0800 Subject: [PATCH 2/2] 117. only use constant extra space --- leetcode/others/connect.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/leetcode/others/connect.go b/leetcode/others/connect.go index 8d5b5eba..64361dca 100644 --- a/leetcode/others/connect.go +++ b/leetcode/others/connect.go @@ -12,23 +12,23 @@ func connect(root *Node) *Node { return nil } - queue := []*Node{root} - for len(queue) > 0 { - levelSize := len(queue) - for i := 0; i < levelSize; i++ { - node := queue[i] - if i < levelSize-1 { - node.Next = queue[i+1] - } + current := root + for current != nil { + dummy := &Node{} + tail := dummy + for node := current; node != nil; node = node.Next { if node.Left != nil { - queue = append(queue, node.Left) + tail.Next = node.Left + tail = tail.Next } if node.Right != nil { - queue = append(queue, node.Right) + tail.Next = node.Right + tail = tail.Next } } - queue = queue[levelSize:] + current = dummy.Next } + return root }