Skip to content

Commit f43c4fb

Browse files
committed
improve solution
1 parent c8ac023 commit f43c4fb

File tree

2 files changed

+13
-20
lines changed

2 files changed

+13
-20
lines changed

construct-binary-tree-from-preorder-and-inorder-traversal/delight010.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
class Solution {
2-
// Time O(N)
2+
// Time O(N^2)
33
// Space O(N)
44
func buildTree(_ preorder: [Int], _ inorder: [Int]) -> TreeNode? {
5+
return buildTree(preorder[...], inorder[...])
6+
}
7+
8+
func buildTree(_ preorder: ArraySlice<Int>, _ inorder: ArraySlice<Int>) -> TreeNode? {
59
if preorder.isEmpty {
610
return nil
711
}
812

9-
let totalCount = preorder.count
10-
let rootNode = TreeNode(preorder[0])
13+
let rootNode = TreeNode(preorder.first!)
1114
var rootIndex = 0
1215

1316
for (index, value) in inorder.enumerated() {
@@ -16,9 +19,8 @@ class Solution {
1619
break
1720
}
1821
}
19-
20-
rootNode.left = buildTree(Array(preorder[1..<rootIndex + 1]), Array(inorder[0..<rootIndex + 1]))
21-
rootNode.right = buildTree(Array(preorder[1 + rootIndex..<totalCount]), Array(inorder[1 + rootIndex..<totalCount]))
22+
rootNode.left = buildTree(preorder[preorder.startIndex + 1..<preorder.startIndex + rootIndex + 1], inorder[inorder.startIndex..<inorder.startIndex + rootIndex])
23+
rootNode.right = buildTree(preorder[preorder.startIndex + 1 + rootIndex..<preorder.endIndex], inorder[inorder.startIndex + 1 + rootIndex..<inorder.endIndex])
2224

2325
return rootNode
2426
}
Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,20 @@
11
class Solution {
22
// Time O(M * N)
3-
// Space O(N)
3+
// Space O(M + N)
44
func isSubtree(_ root: TreeNode?, _ subRoot: TreeNode?) -> Bool {
55
if let root = root, let subRoot = subRoot {
6-
if root.val == subRoot.val {
7-
return dfs(root.left, subRoot: subRoot.left) && dfs(root.right, subRoot: subRoot.right) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot)
8-
}
9-
return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot)
6+
return dfs(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot)
107
}
118

12-
return false
9+
return root == nil && subRoot == nil
1310
}
1411

1512
private func dfs(_ root: TreeNode?, subRoot: TreeNode?) -> Bool {
16-
if root == nil && subRoot == nil {
17-
return true
18-
}
19-
2013
if let root = root, let subRoot = subRoot {
21-
if root.val == subRoot.val {
22-
return dfs(root.left, subRoot: subRoot.left) && dfs(root.right, subRoot: subRoot.right)
23-
}
14+
return root.val == subRoot.val && dfs(root.left, subRoot.left) && dfs(root.right, subRoot.right)
2415
}
2516

26-
return false
17+
return root == nil && subRoot == nil
2718
}
2819
}
2920

0 commit comments

Comments
 (0)