🕌
LeetCode 872. Leaf-Similar Trees - ==演算子の配列比較
872. Leaf-Similar Trees
Approach
再帰を使って深さ優先探索で解く。
leafノードのみを結果配列に格納し、比較する。
ruby
# Definition for a binary tree node.
# class TreeNode
# attr_accessor :val, :left, :right
# def initialize(val = 0, left = nil, right = nil)
# @val = val
# @left = left
# @right = right
# end
# end
# @param {TreeNode} root1
# @param {TreeNode} root2
# @return {Boolean}
def leaf_similar(root1, root2)
traverse(root1) == traverse(root2)
end
def traverse(root)
results = []
recursion(root, results)
results
end
def recursion(root, results)
if !root.nil?
recursion(root.left, results)
results << root.val if root.left.nil? && root.right.nil?
recursion(root.right, results)
end
end
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def leafSimilar(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool:
def traverse(root):
results = []
recursion(root, results)
return results
def recursion(root, results):
if root is not None:
recursion(root.left, results)
if root.left is None and root.right is None:
results.append(root.val)
recursion(root.right, results)
return traverse(root1) == traverse(root2)
typescript
-
==
を使った2つの配列比較はメモリ上のアドレスを指しているかどうかで判定されるため、配列の中身は比較しない
[1,2,3] == [1,2,3]
=> false
- 配列を文字列に変換し、判定実施する
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function leafSimilar(root1: TreeNode | null, root2: TreeNode | null): boolean {
function traverse(root: TreeNode|null): number[]{
let result: number[] = []
recursion(root, result)
return result
}
function recursion(root: TreeNode | null, result: number[]): void{
if (root) {
if(!root.left && !root.right){
result.push(root.val)
}
recursion(root.left, result)
recursion(root.right, result)
}
}
return JSON.stringify(traverse(root1)) === JSON.stringify(traverse(root2));
};
golang
-
slices.Equal
を使ってスライスの比較を行う
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func leafSimilar(root1 *TreeNode, root2 *TreeNode) bool {
traverse := func(root *TreeNode) []int {
var results []int
var recursion func(root *TreeNode, results *[]int)
recursion = func(root *TreeNode, results *[]int) {
if root != nil {
if root.Left == nil && root.Right == nil {
*results = append(*results, root.Val)
}
recursion(root.Left, results)
recursion(root.Right, results)
}
}
recursion(root, &results)
return results
}
return slices.Equal(traverse(root1), traverse(root2))
}
学習のポイント
- typescriptの、
==
を使った2つの配列比較はメモリ上のアドレスを指しているかどうかで判定する - 各言語での配列比較をまとめた
言語 | 比較方法 | 備考 |
---|---|---|
Ruby | == 演算子 | |
Python | == 演算子 | |
TypeScript | 手動で比較関数を作成 | JSON.stringifyで文字列にして一致比較を実施した |
Go | slices.Equal |
Discussion