Skip to content

Commit 9e15eb4

Browse files
authored
Merge pull request #26 from rihib/invert_binary_tree
Invert Binary Tree
2 parents 889df4f + fdb3a11 commit 9e15eb4

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package invertbinarytree
3+
4+
type TreeNode struct {
5+
Val int
6+
Left *TreeNode
7+
Right *TreeNode
8+
}
9+
10+
/*
11+
時間:3分30秒
12+
13+
再帰的に左右のノードを入れ替えていけば良いというのにはすぐに気づき、すんなり実装することができた。
14+
*/
15+
func invertTreeStep1(root *TreeNode) *TreeNode {
16+
if root == nil {
17+
return nil
18+
}
19+
invertTreeStep1(root.Left)
20+
invertTreeStep1(root.Right)
21+
root.Left, root.Right = root.Right, root.Left
22+
return root
23+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package invertbinarytree
3+
4+
/*
5+
Step1は冗長だったのでリファクタした。
6+
これぐらい短いと早期リターンしなくても良いかなと思い下記のようにしました。
7+
またイテレーティブに解く方法も実装しました。
8+
*/
9+
func invertTreeStep2(root *TreeNode) *TreeNode {
10+
if root != nil {
11+
root.Left, root.Right = invertTreeStep2(root.Right), invertTreeStep2(root.Left)
12+
}
13+
return root
14+
}
15+
16+
func invertTreeIterative(root *TreeNode) *TreeNode {
17+
if root == nil {
18+
return nil
19+
}
20+
stack := []*TreeNode{root}
21+
for len(stack) > 0 {
22+
node := stack[len(stack)-1]
23+
stack = stack[:len(stack)-1]
24+
node.Left, node.Right = node.Right, node.Left
25+
if node.Left != nil {
26+
stack = append(stack, node.Left)
27+
}
28+
if node.Right != nil {
29+
stack = append(stack, node.Right)
30+
}
31+
}
32+
return root
33+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package invertbinarytree
3+
4+
func invertTreeRecursive(root *TreeNode) *TreeNode {
5+
if root == nil {
6+
return nil
7+
}
8+
root.Left, root.Right = invertTreeRecursive(root.Right), invertTreeRecursive(root.Left)
9+
return root
10+
}

0 commit comments

Comments
 (0)