|
| 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 | +// } |
| 130 | + |
0 commit comments