Skip to content

Commit c8b3b43

Browse files
committed
solve(w15): 572. Subtree of Another Tree
1 parent 3ec3b9e commit c8b3b43

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# https://leetcode.com/problems/subtree-of-another-tree/
2+
3+
from typing import Optional
4+
5+
# Definition for a binary tree node.
6+
class TreeNode:
7+
def __init__(self, val=0, left=None, right=None):
8+
self.val = val
9+
self.left = left
10+
self.right = right
11+
12+
class Solution:
13+
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
14+
"""
15+
[Complexity]
16+
- TC: O(n * m) (n = root ๋‚ด ๋…ธ๋“œ ๊ฐœ์ˆ˜, m = subRoot ๋‚ด ๋…ธ๋“œ ๊ฐœ์ˆ˜)
17+
- SC: O(n + m) (call stack)
18+
19+
[Approach]
20+
๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
21+
(1) tree๋ฅผ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๋Š” ๋กœ์ง : dfs
22+
(2) ๋‘ tree๊ฐ€ ๋™์ผํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๋กœ์ง : check
23+
"""
24+
25+
def check(node1, node2):
26+
# base condition
27+
if not node1 and not node2:
28+
return True
29+
if not node1 or not node2:
30+
return False
31+
32+
# recur
33+
return (
34+
node1.val == node2.val # ๋‘ ๋…ธ๋“œ์˜ ๊ฐ’์ด ๊ฐ™๊ณ 
35+
and check(node1.left, node2.left) # ํ•˜์œ„ children๋„ ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•จ
36+
and check(node1.right, node2.right)
37+
)
38+
39+
def dfs(node, sub_tree):
40+
# base condition
41+
if not node:
42+
return False
43+
44+
# recur
45+
return (
46+
check(node, sub_tree) # ํ˜„์žฌ node๋ถ€ํ„ฐ sub_tree์™€ ๋™์ผํ•œ์ง€ ํ™•์ธ
47+
or dfs(node.left, sub_tree) # ๋™์ผํ•˜์ง€ ์•Š๋‹ค๋ฉด, node.left๋กœ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€์„œ ํ™•์ธ
48+
or dfs(node.right, sub_tree) # ๋™์ผํ•˜์ง€ ์•Š๋‹ค๋ฉด, node.right๋กœ๋„ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€์„œ ํ™•์ธ
49+
)
50+
51+
return dfs(root, subRoot)

0 commit comments

Comments
ย (0)