1+ /**
2+ * Definition for a binary tree node.
3+ * public class TreeNode {
4+ * int val;
5+ * TreeNode left;
6+ * TreeNode right;
7+ * TreeNode() {}
8+ * TreeNode(int val) { this.val = val; }
9+ * TreeNode(int val, TreeNode left, TreeNode right) {
10+ * this.val = val;
11+ * this.left = left;
12+ * this.right = right;
13+ * }
14+ * }
15+ */
16+
17+ /**
18+ * μ²μμλ κ°μ₯ μλμ μ½λμ κ°μ΄ BFS λ‘ μ κ·Όν΄μ νλ €κ³ νμμ§λ§ μκ³ λ¦¬μ¦ μ νμ΄ μλͺ»λμμμ κΉ¨λ¬μλ€.
19+ * μ²μ BFS λ‘ μ κ·Όνλ μ΄μ λ λ
Έλμ κ°μ΄ λμΌν κ²½μ°λ₯Ό μ°Ύμμ λ κ·ΈλλΆν° νΈλ¦¬λ₯Ό μννλ©΄μ μλ‘ λΉκ΅νλ©΄ λ μ€ μμλ€.
20+ * νμ§λ§ μ΄λ κ² λ¬Έμ λ₯Ό νλ €κ³ νλ μ¬λ¬ μ£μ§ μΌμ΄μ€λ€μ λμ³€μλ€. [1] [0] / [1] [1] λ±λ±
21+ * κ·Έλ¦¬κ³ κ°μ λ
Έλμ κ°μ μ°Ύμλ€ νλ€ μ°Ύμμ λ λ€μ DFSλ‘ μ κ·Όνλ? λ무 볡μ‘ν λ°©μμ ννλ€. λ무 λμκ°λ€. (μ΄λ λκ° μλͺ»λμμμ λκΌλ€.)
22+ *
23+ * μ²μλΆν° DFSλ₯Ό μ ννμ΄μΌ νκ³ λ¬Έμ νΉμ±μ 쑰건λ€μ΄ μ¬κ·μ μΌλ‘ μ μκ° λμλ€. A B κ° λμΌνκ° ? / A μΌμͺ½ μλΈνΈλ¦¬κ° Bλ₯Ό ν¬ν¨νλκ° ? / A μ€λ₯Έμͺ½ μλΈνΈλ¦¬κ° B λ₯Ό ν¬ν¨νλκ° ?
24+ * μ¬κΈ°μ λΉκ΅νλ €λ 2κ°μ λ
Έλλ₯Ό λκ³ λκ°μ ν¬μΈνΈλ₯Ό νμνλ©° μ€μ μ¬λμΈ λ΄κ° λΉκ΅νλ €λ κ² μ²λΌ λΉκ΅νλκ²μ΄ μλμλ€.
25+ * ν¬μΈνΈλ λ¬Έμ μ²λΌ rootκ° subRootλ₯Ό μλΈνΈλ¦¬λ‘ ν¬ν¨νλκ° ? μ΄λ€.
26+ * μ΄κ±Έ 3κ°μ§ ν¬μΈνΈλ‘ λλμ΄μ root μ subRootκ° κ·Έ μμ²΄λ‘ λμΌνκ° ? / root.leftμ SubRoot , root.right μ subRootκ° λμΌνκ°λ₯Ό 보λ κ²μ΄μλ€.
27+ * κ·Έλ¦¬κ³ μ¬κΈ°μ μ¬κ·λ₯Ό μ¬μ©ν΄μ κ°μ 체ν¬νλ κ²μ΄ ν¬μΈνΈμλ€.
28+ * BFSμ DFSλ₯Ό μ μ΄ν΄νκ³ μ¬μ©νμ.
29+ */
30+
31+ import java .util .*;
32+
33+ class Solution {
34+ public boolean isSubtree (TreeNode root , TreeNode subRoot ) {
35+ // subRoot κ° null μ΄λ©΄ trueλ₯Ό λ°ννλ€. μλνλ©΄ λͺ¨λ λ
Έλλ€μ μμλ
Έλλ‘ null μ κ°μ§ μ μκΈ° λλ¬Έμ΄λ€.
36+ if (subRoot == null ) {
37+ return true ;
38+ }
39+
40+ // subRoot κ° null μ΄ μλλ° root λ§ null μ΄λ©΄ μ΄ λμ λ
Έλλ λ€λ₯΄λ€λ μλ―Έμ΄λ€.
41+ if (root == null ) {
42+ return false ;
43+ }
44+
45+ // μ 2κ°μ null 체ν¬λ₯Ό νκ³ rootμ subRoot κ° μλ‘ λμΌνμ§ μ²΄ν¬νλ€.
46+ if (isSameTree (root , subRoot )) {
47+ return true ;
48+ }
49+
50+ return isSubtree (root .left , subRoot ) || isSubtree (root .right , subRoot );
51+ }
52+
53+ public boolean isSameTree (TreeNode root , TreeNode subRoot ) {
54+ if (root == null && subRoot == null ) {
55+ return true ; // 2κ°μ λ
Έλ value κ° λͺ¨λ null μ΄λ©΄ true λ°ν
56+ }
57+
58+ if (root == null || subRoot == null || root .val != subRoot .val ) {
59+ return false ; // 2κ°μ€ νλλ§ Null μ΄κ±°λ 2κ°μ λ
Έλ κ°μ΄ λ€λ₯Ό κ²½μ° false λ°ν
60+ }
61+
62+ // μ 2κ°μ μν©μ΄ μλλ©΄ λͺ¨λ κ°μ κ°μ κ°μ§ λ
Έλλ€μ κ°μ΄ κ°λ€λ μλ―Έμ΄λ―λ‘ μ¬κ·μ μΌλ‘ μμλ€μ 체ν¬
63+ return isSameTree (root .left , subRoot .left ) && isSameTree (root .right , subRoot .right );
64+ }
65+ }
66+
67+ // import java.util.*;
68+
69+ // class Solution {
70+ // static boolean result;
71+ // public boolean isSubtree(TreeNode root, TreeNode subRoot) {
72+ // result = true;
73+
74+ // Queue<TreeNode> queue = new LinkedList<>();
75+ // queue.offer(root);
76+ // int subRootValue = subRoot.val;
77+ // if (root == null && subRoot == null) {
78+ // return true;
79+ // }
80+
81+ // if (root.left == null && root.right == null && subRoot.left == null && subRoot.right == null) {
82+ // if (root.val == subRootValue) {
83+ // return true;
84+ // } else {
85+ // return false;
86+ // }
87+ // }
88+
89+ // while (!queue.isEmpty()) {
90+ // TreeNode qRoot = queue.poll();
91+ // if (qRoot.val == subRootValue) {
92+ // result = checkEqual(qRoot, subRoot);
93+ // break;
94+ // }
95+
96+ // if (qRoot.left != null) {
97+ // if (qRoot.left.val == subRootValue) {
98+ // result = checkEqual(qRoot.left, subRoot);
99+ // break;
100+ // }
101+ // queue.offer(qRoot.left);
102+ // }
103+
104+ // if (qRoot.right != null) {
105+ // if (qRoot.right.val == subRootValue) {
106+ // result = checkEqual(qRoot.right, subRoot);
107+ // break;
108+ // }
109+ // queue.offer(qRoot.right);
110+ // }
111+ // }
112+
113+ // return result;
114+ // }
115+
116+ // public boolean checkEqual(TreeNode root, TreeNode subRoot) {
117+ // if (root == null && subRoot == null) {
118+ // return true; // 2κ°μ λ
Έλ value κ° λͺ¨λ null μ΄λ©΄ true λ°ν
119+ // }
120+
121+ // if (root == null || subRoot == null || root.val != subRoot.val) {
122+ // return false; // 2κ°μ€ νλλ§ Null μ΄κ±°λ 2κ°μ λ
Έλ κ°μ΄ λ€λ₯Ό κ²½μ° false λ°ν
123+ // }
124+
125+ // // μ 2κ°μ μν©μ΄ μλλ©΄ λͺ¨λ κ°μ κ°μ κ°μ§ λ
Έλλ€μ κ°μ΄ κ°λ€λ μλ―Έμ΄λ―λ‘ μ¬κ·μ μΌλ‘ μμλ€μ 체ν¬
126+
127+ // return checkEqual(root.left, subRoot.left) && checkEqual(root.right, subRoot.right);
128+ // }
129+ // }
0 commit comments