Home LeetCode - 993. Cousins in Binary Tree
Post
Cancel

LeetCode - 993. Cousins in Binary Tree

993. Cousins in Binary Tree - easy

문제

In a binary tree, the root node is at depth 0, and children of each depth k node are at depth k+1.

Two nodes of a binary tree are cousins if they have the same depth, but have different parents.

We are given the root of a binary tree with unique values, and the values x and y of two different nodes in the tree.

Return true if and only if the nodes corresponding to the values x and y are cousins.

제한사항

  • The number of nodes in the tree will be between 2 and 100.
  • Each node has a unique integer value from 1 to 100.

입출력 예

example

1
2
Input: root = [1,2,3,4], x = 4, y = 3
Output: false

example

1
2
Input: root = [1,2,3,null,4,null,5], x = 5, y = 4
Output: true

example

1
2
Input: root = [1,2,3,null,4], x = 2, y = 3
Output: false

풀이

  • Tree, DFS, BFS, Recursive
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isCousins(root *TreeNode, x int, y int) bool {
    xDepth := findDepth(root, x)
    yDepth := findDepth(root, y)
    checkSameParent := isSameParent(root, x, y)
    
    if (xDepth == yDepth) && !checkSameParent {
        return true
    }

    return false
}

// 재귀를 통해 해당 값을 가진 노드의 depth를 구함
func findDepth(root *TreeNode, x int) int {
    if root == nil {
        return -100
    }
    
    if root.Val == x {
        return 0
    }
    
    depth, left, right := 0, 1, 1
    
    left += findDepth(root.Left, x)
    right += findDepth(root.Right, x)
    
    if left >= 0 {
        depth = left
    } else {
        depth = right
    }
        
    return depth
}

// 재귀를 통해 해당 값들을 가진 노드들이 같은 부모를 가지고 있는지 검사
func isSameParent(root *TreeNode, x int, y int) bool {
    if root == nil {
        return false
    }
    
    if root.Left == nil && root.Right == nil {
        return false
    }
    
    if root.Left != nil && root.Right != nil {        
        if (root.Left.Val == x && root.Right.Val == y) ||
            (root.Left.Val == y && root.Right.Val == x) {
                return true
        }
    }
    
    return isSameParent(root.Left,x,y) || isSameParent(root.Right,x,y)
}
This post is licensed under CC BY 4.0 by the author.