From 7b13520a5d41b981d5c885456f575d678a17a5f8 Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Thu, 25 Apr 2024 09:22:43 +0100 Subject: [PATCH 1/4] Swift Implementation for LCCI 04.10 --- lcci/04.10.Check SubTree/README.md | 30 +++++++++++++++++++++++++ lcci/04.10.Check SubTree/README_EN.md | 30 +++++++++++++++++++++++++ lcci/04.10.Check SubTree/Solution.swift | 27 ++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 lcci/04.10.Check SubTree/Solution.swift diff --git a/lcci/04.10.Check SubTree/README.md b/lcci/04.10.Check SubTree/README.md index fe52620d24a15..78466e6d8d9bc 100644 --- a/lcci/04.10.Check SubTree/README.md +++ b/lcci/04.10.Check SubTree/README.md @@ -201,6 +201,36 @@ impl Solution { } ``` +```swift +/* class TreeNode { +* var val: Int +* var left: TreeNode? +* var right: TreeNode? +* +* init(_ val: Int, _ left: TreeNode? = nil, _ right: TreeNode? = nil) { +* self.val = val +* self.left = left +* self.right = right +* } +* } +*/ + +class Solution { + func checkSubTree(_ t1: TreeNode?, _ t2: TreeNode?) -> Bool { + if t2 == nil { + return true + } + if t1 == nil { + return false + } + if t1!.val == t2!.val { + return checkSubTree(t1!.left, t2!.left) && checkSubTree(t1!.right, t2!.right) + } + return checkSubTree(t1!.left, t2) || checkSubTree(t1!.right, t2) + } +} +``` + diff --git a/lcci/04.10.Check SubTree/README_EN.md b/lcci/04.10.Check SubTree/README_EN.md index b1435c469cd46..d726af3e3dc63 100644 --- a/lcci/04.10.Check SubTree/README_EN.md +++ b/lcci/04.10.Check SubTree/README_EN.md @@ -208,6 +208,36 @@ impl Solution { } ``` +```swift +/* class TreeNode { +* var val: Int +* var left: TreeNode? +* var right: TreeNode? +* +* init(_ val: Int, _ left: TreeNode? = nil, _ right: TreeNode? = nil) { +* self.val = val +* self.left = left +* self.right = right +* } +* } +*/ + +class Solution { + func checkSubTree(_ t1: TreeNode?, _ t2: TreeNode?) -> Bool { + if t2 == nil { + return true + } + if t1 == nil { + return false + } + if t1!.val == t2!.val { + return checkSubTree(t1!.left, t2!.left) && checkSubTree(t1!.right, t2!.right) + } + return checkSubTree(t1!.left, t2) || checkSubTree(t1!.right, t2) + } +} +``` + diff --git a/lcci/04.10.Check SubTree/Solution.swift b/lcci/04.10.Check SubTree/Solution.swift new file mode 100644 index 0000000000000..70a54eb3b1965 --- /dev/null +++ b/lcci/04.10.Check SubTree/Solution.swift @@ -0,0 +1,27 @@ +/* class TreeNode { +* var val: Int +* var left: TreeNode? +* var right: TreeNode? +* +* init(_ val: Int, _ left: TreeNode? = nil, _ right: TreeNode? = nil) { +* self.val = val +* self.left = left +* self.right = right +* } +* } +*/ + +class Solution { + func checkSubTree(_ t1: TreeNode?, _ t2: TreeNode?) -> Bool { + if t2 == nil { + return true + } + if t1 == nil { + return false + } + if t1!.val == t2!.val { + return checkSubTree(t1!.left, t2!.left) && checkSubTree(t1!.right, t2!.right) + } + return checkSubTree(t1!.left, t2) || checkSubTree(t1!.right, t2) + } +} \ No newline at end of file From 561a9b96a6482a38d360995f32cbc65574d64bbc Mon Sep 17 00:00:00 2001 From: klever34 Date: Thu, 25 Apr 2024 08:33:52 +0000 Subject: [PATCH 2/4] style: format code and docs with prettier --- lcci/04.10.Check SubTree/README.md | 4 ++-- lcci/04.10.Check SubTree/README_EN.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lcci/04.10.Check SubTree/README.md b/lcci/04.10.Check SubTree/README.md index 78466e6d8d9bc..01724ce5d0a3f 100644 --- a/lcci/04.10.Check SubTree/README.md +++ b/lcci/04.10.Check SubTree/README.md @@ -206,13 +206,13 @@ impl Solution { * var val: Int * var left: TreeNode? * var right: TreeNode? -* +* * init(_ val: Int, _ left: TreeNode? = nil, _ right: TreeNode? = nil) { * self.val = val * self.left = left * self.right = right * } -* } +* } */ class Solution { diff --git a/lcci/04.10.Check SubTree/README_EN.md b/lcci/04.10.Check SubTree/README_EN.md index d726af3e3dc63..e163a2f343aab 100644 --- a/lcci/04.10.Check SubTree/README_EN.md +++ b/lcci/04.10.Check SubTree/README_EN.md @@ -213,13 +213,13 @@ impl Solution { * var val: Int * var left: TreeNode? * var right: TreeNode? -* +* * init(_ val: Int, _ left: TreeNode? = nil, _ right: TreeNode? = nil) { * self.val = val * self.left = left * self.right = right * } -* } +* } */ class Solution { From 8f551600dc16823db568dcd5b2e4773043b91068 Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Thu, 25 Apr 2024 13:37:34 +0100 Subject: [PATCH 3/4] code logic update --- lcci/04.10.Check SubTree/README.md | 17 +++++++++++++++-- lcci/04.10.Check SubTree/README_EN.md | 17 +++++++++++++++-- lcci/04.10.Check SubTree/Solution.swift | 17 +++++++++++++++-- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/lcci/04.10.Check SubTree/README.md b/lcci/04.10.Check SubTree/README.md index 01724ce5d0a3f..9eb4384eab3bf 100644 --- a/lcci/04.10.Check SubTree/README.md +++ b/lcci/04.10.Check SubTree/README.md @@ -223,11 +223,24 @@ class Solution { if t1 == nil { return false } - if t1!.val == t2!.val { - return checkSubTree(t1!.left, t2!.left) && checkSubTree(t1!.right, t2!.right) + if isSameTree(t1, t2) { + return true } return checkSubTree(t1!.left, t2) || checkSubTree(t1!.right, t2) } + + private func isSameTree(_ t1: TreeNode?, _ t2: TreeNode?) -> Bool { + if t1 == nil && t2 == nil { + return true + } + if t1 == nil || t2 == nil { + return false + } + if t1!.val != t2!.val { + return false + } + return isSameTree(t1!.left, t2!.left) && isSameTree(t1!.right, t2!.right) + } } ``` diff --git a/lcci/04.10.Check SubTree/README_EN.md b/lcci/04.10.Check SubTree/README_EN.md index e163a2f343aab..ca16b4debbbde 100644 --- a/lcci/04.10.Check SubTree/README_EN.md +++ b/lcci/04.10.Check SubTree/README_EN.md @@ -230,11 +230,24 @@ class Solution { if t1 == nil { return false } - if t1!.val == t2!.val { - return checkSubTree(t1!.left, t2!.left) && checkSubTree(t1!.right, t2!.right) + if isSameTree(t1, t2) { + return true } return checkSubTree(t1!.left, t2) || checkSubTree(t1!.right, t2) } + + private func isSameTree(_ t1: TreeNode?, _ t2: TreeNode?) -> Bool { + if t1 == nil && t2 == nil { + return true + } + if t1 == nil || t2 == nil { + return false + } + if t1!.val != t2!.val { + return false + } + return isSameTree(t1!.left, t2!.left) && isSameTree(t1!.right, t2!.right) + } } ``` diff --git a/lcci/04.10.Check SubTree/Solution.swift b/lcci/04.10.Check SubTree/Solution.swift index 70a54eb3b1965..5cb011e335bd1 100644 --- a/lcci/04.10.Check SubTree/Solution.swift +++ b/lcci/04.10.Check SubTree/Solution.swift @@ -19,9 +19,22 @@ class Solution { if t1 == nil { return false } - if t1!.val == t2!.val { - return checkSubTree(t1!.left, t2!.left) && checkSubTree(t1!.right, t2!.right) + if isSameTree(t1, t2) { + return true } return checkSubTree(t1!.left, t2) || checkSubTree(t1!.right, t2) } + + private func isSameTree(_ t1: TreeNode?, _ t2: TreeNode?) -> Bool { + if t1 == nil && t2 == nil { + return true + } + if t1 == nil || t2 == nil { + return false + } + if t1!.val != t2!.val { + return false + } + return isSameTree(t1!.left, t2!.left) && isSameTree(t1!.right, t2!.right) + } } \ No newline at end of file From 9276667d4ed505c75d2b140c50c252a37fb3e94f Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Thu, 25 Apr 2024 20:57:41 +0800 Subject: [PATCH 4/4] Update README_EN.md --- lcci/04.10.Check SubTree/README_EN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lcci/04.10.Check SubTree/README_EN.md b/lcci/04.10.Check SubTree/README_EN.md index 58d66e46703c6..b8b0c534015df 100644 --- a/lcci/04.10.Check SubTree/README_EN.md +++ b/lcci/04.10.Check SubTree/README_EN.md @@ -42,7 +42,7 @@ First, we check if $t_2$ is null. If it is, then $t_2$ is definitely a subtree o Otherwise, we check if $t_1$ is null. If it is, then $t_2$ is definitely not a subtree of $t_1$, so we return `false`. -Next, we check if $t_1$ and $t_2$ are equal. If they are, then $t_2$ is a subtree of $t_1$, so we return `true`. Otherwise, we recursively check if $t_1$'s left subtree is equal to $t_2$, and if $t_1$'s right subtree is equal to $t_2$. If either is `true`, then $t_2$ is a subtree of $t_1`, so we return `true`. +Next, we check if $t_1$ and $t_2$ are equal. If they are, then $t_2$ is a subtree of $t_1$, so we return `true`. Otherwise, we recursively check if $t_1$'s left subtree is equal to $t_2$, and if $t_1$'s right subtree is equal to $t_2$. If either is `true`, then $t_2$ is a subtree of $t_1$, so we return `true`. The time complexity is $O(n^2)$, and the space complexity is $O(n)$. Where $n$ is the number of nodes in $t_1$.