diff --git a/pullrequests/symmetric_tree/step1.go b/pullrequests/symmetric_tree/step1.go new file mode 100644 index 0000000..ad88730 --- /dev/null +++ b/pullrequests/symmetric_tree/step1.go @@ -0,0 +1,35 @@ +//lint:file-ignore U1000 Ignore all unused code +package symmetrictree + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +初見で解くことができなかったので、他の解法を見て解いた。再帰の練習が足りてなさそう。 +*/ +func isSymmetricRecursive(root *TreeNode) bool { + // 問題的にはrootはnilにならないのでこの処理は必要ないが + // 一応nilのときはtrue扱いにすると決めて書いた + if root == nil { + return true + } + return isMirror(root.Left, root.Right) +} + +func isMirror(left, right *TreeNode) bool { + if left == nil && right == nil { + return true + } + if left == nil || right == nil { + return false + } + return left.Val == right.Val && isMirror(left.Left, right.Right) && isMirror(left.Right, right.Left) +} diff --git a/pullrequests/symmetric_tree/step2.go b/pullrequests/symmetric_tree/step2.go new file mode 100644 index 0000000..37ab6b1 --- /dev/null +++ b/pullrequests/symmetric_tree/step2.go @@ -0,0 +1,36 @@ +//lint:file-ignore U1000 Ignore all unused code +package symmetrictree + +import "container/list" + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +イテレーティブにも解いてみた。BFSなのでキューを使って実装した。 +*/ +func isSymmetric(root *TreeNode) bool { + if root == nil { + return true + } + queue := list.New() + queue.PushBack(root.Left) + queue.PushBack(root.Right) + for queue.Len() > 0 { + left := queue.Remove(queue.Front()).(*TreeNode) + right := queue.Remove(queue.Front()).(*TreeNode) + if left == nil && right == nil { + continue + } + if left == nil || right == nil || left.Val != right.Val { + return false + } + queue.PushBack(left.Left) + queue.PushBack(right.Right) + queue.PushBack(left.Right) + queue.PushBack(right.Left) + } + return true +}