|
| 1 | +from typing import Optional |
| 2 | + |
| 3 | + |
| 4 | +class TreeNode: |
| 5 | + def __init__(self, val=0, left=None, right=None): |
| 6 | + self.val = val |
| 7 | + self.left = left |
| 8 | + self.right = right |
| 9 | + |
| 10 | + |
| 11 | +class Solution: |
| 12 | + def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool: |
| 13 | + if not subRoot: |
| 14 | + return True |
| 15 | + if not root: |
| 16 | + return False |
| 17 | + |
| 18 | + if self.isSameTree(root, subRoot): |
| 19 | + return True |
| 20 | + |
| 21 | + has_subroot_in_left = self.isSubtree(root.left, subRoot) |
| 22 | + has_subroot_in_right = self.isSubtree(root.right, subRoot) |
| 23 | + |
| 24 | + return has_subroot_in_left or has_subroot_in_right |
| 25 | + |
| 26 | + def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool: |
| 27 | + """ |
| 28 | + - Idea: ๋ ํธ๋ฆฌ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋
ธ๋ ๋จ์๋ก ๋น๊ตํ๋ค. |
| 29 | + 1. ๋ ๋
ธ๋๊ฐ ๋ชจ๋ None์ด๋ผ๋ฉด ํ์ฌ ๋ ํธ๋ฆฌ๋ ๋์ผ |
| 30 | + 2. ๋ ๋
ธ๋๊ฐ None์ด ์๋๊ณ ๊ฐ์ด ๊ฐ๋ค๋ฉด, ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋น๊ต |
| 31 | + 3. ๋ ๋
ธ๋๊ฐ ๋ค๋ฅด๊ฑฐ๋ ํ์ชฝ๋ง None์ด๋ฉด ๋ ํธ๋ฆฌ๋ ์์ด |
| 32 | + - Time Complexity: O(m). m์ ๋ ์์ ํธ๋ฆฌ์ ๋
ธ๋ ์ |
| 33 | + ๊ฐ ๋
ธ๋๋ฅผ ํ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ฏ๋ก O(m) ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. |
| 34 | + - Space Complexity: O(h). h๋ ๋ ์์ ํธ๋ฆฌ์ ๋์ด |
| 35 | + ์ฌ๊ท ํธ์ถ ์คํ์ ์ต๋ h๋งํผ์ ๊ณต๊ฐ์ด ์ฌ์ฉ๋๋ค. |
| 36 | + """ |
| 37 | + |
| 38 | + if not p and not q: |
| 39 | + return True |
| 40 | + |
| 41 | + if p and q and p.val == q.val: |
| 42 | + is_left_equal = self.isSameTree(p.left, q.left) |
| 43 | + is_right_equal = self.isSameTree(p.right, q.right) |
| 44 | + |
| 45 | + return is_left_equal and is_right_equal |
| 46 | + |
| 47 | + return False |
0 commit comments