File tree Expand file tree Collapse file tree 1 file changed +61
-0
lines changed
Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Original file line number Diff line number Diff line change 1+ class TreeNode {
2+ val : number ;
3+ left : TreeNode | null ;
4+ right : TreeNode | null ;
5+ constructor ( val ?: number , left ?: TreeNode | null , right ?: TreeNode | null ) {
6+ this . val = val === undefined ? 0 : val ;
7+ this . left = left === undefined ? null : left ;
8+ this . right = right === undefined ? null : right ;
9+ }
10+ }
11+
12+ /**
13+ *
14+ * 접근 방법 :
15+ * - DFS로 루트 노드를 찾은 뒤, 하위 트리가 동일한 트리인지 확인하기
16+ *
17+ * 시간복잡도 : O(n * m)
18+ * - n = root 트리 노드의 개수
19+ * - m = subRoot 트리 노드의 개수
20+ * - 루트 노드 찾기 위해서 O(n)
21+ * - 동일 트리 체크하기 위해서 O(m)
22+ *
23+ * 공간복잡도 : O(n + m)
24+ * - n = root 트리 높이
25+ * - m = subRoot 트리 높이
26+ * - dfs 탐색 최대 깊이 O(n)
27+ * - isSameTree 탐색 최대 깊이 O(m)
28+ *
29+ */
30+ function isSubtree ( root : TreeNode | null , subRoot : TreeNode | null ) : boolean {
31+ if ( ! root ) return false ;
32+
33+ const isSameTree = (
34+ node : TreeNode | null ,
35+ subNode : TreeNode | null
36+ ) : boolean => {
37+ // 두 노드가 null이면 동일한 트리
38+ if ( ! node && ! subNode ) return true ;
39+ // 한 노드만 null이면 다른 트리
40+ if ( ! node || ! subNode ) return false ;
41+ // 값이 다르면 다른 트리
42+ if ( node . val !== subNode . val ) return false ;
43+
44+ // 값이 같으니까 왼쪽, 오른쪽 하위 트리도 비교
45+ return (
46+ isSameTree ( node . left , subNode . left ) &&
47+ isSameTree ( node . right , subNode . right )
48+ ) ;
49+ } ;
50+
51+ // 루트 노드 찾기
52+ const dfs = ( node : TreeNode | null ) : boolean => {
53+ if ( ! node ) return false ;
54+ // 동일한 트리인지 확인
55+ if ( isSameTree ( node , subRoot ) ) return true ;
56+ // 왼쪽이나 오른쪽 추가 탐색 진행
57+ return dfs ( node . left ) || dfs ( node . right ) ;
58+ } ;
59+
60+ return dfs ( root ) ;
61+ }
You can’t perform that action at this time.
0 commit comments