From 33992b06bb47f20e87d9b6d03f614f1617272d59 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 18 Dec 2024 15:23:19 +0900 Subject: [PATCH] pullrequests/symmetric_tree --- pullrequests/symmetric_tree/step1.go | 35 +++++++++++++++++++++++++++ pullrequests/symmetric_tree/step2.go | 36 ++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 pullrequests/symmetric_tree/step1.go create mode 100644 pullrequests/symmetric_tree/step2.go 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 +}