Leetcode Note: Go - Symmetric Tree
Symmetric Tree - LeetCode
https://leetcode.com/problems/symmetric-tree/
- Go 言語で取り組んだメモ
所感
- 再帰呼び出しが使えそうな雰囲気がある
- しかし、シンメトリーの判定をどのように実装したら良いのだろう・・・
実装準備
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
}
回答
Simple recursive solution in Go - LeetCode Discuss
https://leetcode.com/problems/symmetric-tree/discuss/916411/Simple-recursive-solution-in-Go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isMirror(node1 *TreeNode, node2 *TreeNode) bool {
if node1 == nil && node2 == nil {
return true
}
if node1 == nil || node2 == nil {
return false
}
return node1.Val == node2.Val && isMirror(node1.Right, node2.Left) && isMirror(node1.Left, node2.Right)
}
func isSymmetric(root *TreeNode) bool {
return isMirror(root, root)
}
- 2つ の Node が同じか比較する isMirror 関数を実装する
node1 == nil
andnode2 == nil
なら Node の内容は同じなので return truenode1 == nil
ornode2 == nil
は and の次に実装しているので、実質 xor となるため Node の内容は異なると判定して return false- return: 以下の 3つ が全て真なら true を返す
node1.Val == node2.Val
- node1 と node2 が持つ値が同じ
isMirror(node1.Right, node2.Left)
- node1 の右と、 node2 の左が同じ
isMirror(node1.Left, node2.Right)
- node1 の左と、 node2 の右が同じ
- isMirror 関数に、引数で与えられる root を指定することで、最終的にシンメトリーか判定できる
熟考してれば自力でたどり着けたかも感があって悔しみがある