Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions pullrequests/invert_binary_tree/step1.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//lint:file-ignore U1000 Ignore all unused code
package invertbinarytree

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

/*
時間:3分30秒

再帰的に左右のノードを入れ替えていけば良いというのにはすぐに気づき、すんなり実装することができた。
*/
func invertTreeStep1(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
invertTreeStep1(root.Left)
invertTreeStep1(root.Right)
root.Left, root.Right = root.Right, root.Left
return root
}
33 changes: 33 additions & 0 deletions pullrequests/invert_binary_tree/step2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//lint:file-ignore U1000 Ignore all unused code
package invertbinarytree

/*
Step1は冗長だったのでリファクタした。
これぐらい短いと早期リターンしなくても良いかなと思い下記のようにしました。
またイテレーティブに解く方法も実装しました。
*/
func invertTreeStep2(root *TreeNode) *TreeNode {
if root != nil {
root.Left, root.Right = invertTreeStep2(root.Right), invertTreeStep2(root.Left)
}
return root
}

func invertTreeIterative(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
stack := []*TreeNode{root}
for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
node.Left, node.Right = node.Right, node.Left
if node.Left != nil {
stack = append(stack, node.Left)
}
if node.Right != nil {
stack = append(stack, node.Right)
}
}
return root
}
10 changes: 10 additions & 0 deletions pullrequests/invert_binary_tree/step3.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
//lint:file-ignore U1000 Ignore all unused code
package invertbinarytree

func invertTreeRecursive(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
root.Left, root.Right = invertTreeRecursive(root.Right), invertTreeRecursive(root.Left)
return root
}