1+ /**
2+ * Definition for a binary tree node.
3+ * public class TreeNode {
4+ * public var val: Int
5+ * public var left: TreeNode?
6+ * public var right: TreeNode?
7+ * public init() { self.val = 0; self.left = nil; self.right = nil; }
8+ * public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
9+ * public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
10+ * self.val = val
11+ * self.left = left
12+ * self.right = right
13+ * }
14+ * }
15+ */
16+ class Solution {
17+ private func areSameTrees(
18+ _ node1: TreeNode ? ,
19+ _ node2: TreeNode ?
20+ ) -> Bool {
21+ // if both are nil, they are same
22+ if node1 == nil && node2 == nil { return true }
23+
24+ // if anyone else is nil, they are not the same
25+ guard let node1 = node1 else { return false }
26+ guard let node2 = node2 else { return false }
27+
28+ return (
29+ ( node1. val == node2. val) &&
30+ areSameTrees ( node1. left, node2. left) &&
31+ areSameTrees ( node1. right, node2. right)
32+ )
33+ }
34+
35+ func isSubtree( _ root: TreeNode ? , _ subRoot: TreeNode ? ) -> Bool {
36+ // Base cases (both can be nil, just any one can't)
37+ if root == nil && subRoot == nil { return true }
38+ guard let root = root else { return false }
39+ guard let subRoot = subRoot else { return false }
40+
41+ // Base case: Exactly same tree
42+ if areSameTrees ( root, subRoot) { return true }
43+
44+ // Recursive
45+ return isSubtree ( root. left, subRoot)
46+ || isSubtree ( root. right, subRoot)
47+ }
48+ }
0 commit comments