-
Notifications
You must be signed in to change notification settings - Fork 214
/
ObjC_Medium_095_Unique_Binary_Search_Trees_II.m
75 lines (58 loc) · 2.57 KB
/
ObjC_Medium_095_Unique_Binary_Search_Trees_II.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
https://leetcode.com/problems/unique-binary-search-trees-ii/
#95 Unique Binary Search Trees II
Level: medium
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
Inspired by @Jayanta at https://leetcode.com/discuss/10254/a-simple-recursive-solution
*/
#import "ObjC_Medium_095_Unique_Binary_Search_Trees_II.h"
@implementation ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node
- (instancetype)init {
return [self initWithValue:1 left:nil right:nil];
}
- (nonnull instancetype)initWithValue: (NSInteger) value left: (nullable ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node *)left right: (nullable ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node *) right {
if ((self = [super init])) {
_value = value;
_left = [left isKindOfClass:[ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node class]] ? left : nil;
_right = [right isKindOfClass:[ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node class]] ? right : nil;
}
return self;
}
@end
@implementation ObjC_Medium_095_Unique_Binary_Search_Trees_II
+ (nonnull NSArray *)genTreesWithStart: (NSInteger)start end: (NSInteger)end {
if (start > end) {
return @[[NSNull null]];
} else if (start == end) {
ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node *node = [ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node new];
node.value = start;
return @[node];
} else {
NSMutableArray *ret = [NSMutableArray array];
NSArray *left;
NSArray *right;
for (NSInteger i = start; i <= end; i++) {
left = [self genTreesWithStart:start end:i-1];
right = [self genTreesWithStart:i+1 end:end];
for (NSInteger j = 0; j < left.count; j++) {
for (NSInteger k = 0; k < right.count; k++) {
ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node *node = [[ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node alloc] initWithValue:i left:left[j] right:right[k]];
[ret addObject:node];
}
}
}
return [ret copy];
}
}
// t = O(n^(n-1)) a.k.a Catalan Number, s = I've no idea
+ (nonnull NSArray<ObjC_Medium_095_Unique_Binary_Search_Trees_II_Node *> *)generateTrees:(NSInteger) n {
return [self genTreesWithStart:1 end:n];
}
@end