Skip to content

Commit b0ed898

Browse files
committed
feat: add solutions to lc problem: No.0894
No.0894.All Possible Full Binary Trees
1 parent d716645 commit b0ed898

File tree

6 files changed

+420
-3
lines changed

6 files changed

+420
-3
lines changed

solution/0800-0899/0894.All Possible Full Binary Trees/README.md

Lines changed: 149 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,169 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

43-
<!-- tabs:start -->
43+
**方法一:记忆化搜索**
44+
45+
对于 $n=1$,直接返回单个节点的列表。
46+
47+
对于 $n\gt1$,若 $n$ 为奇数,按照左右子树遍历不同的排列组合,得到结果列表;若 $n$ 为偶数,返回空列表。
48+
49+
此过程可以用记忆化搜索,避免重复计算。
50+
51+
时间复杂度 $O(2^n)$,空间复杂度 $O(2^n)$。
4452

4553
### **Python3**
4654

4755
<!-- 这里可写当前语言的特殊实现逻辑 -->
4856

4957
```python
50-
58+
# Definition for a binary tree node.
59+
# class TreeNode:
60+
# def __init__(self, val=0, left=None, right=None):
61+
# self.val = val
62+
# self.left = left
63+
# self.right = right
64+
class Solution:
65+
def allPossibleFBT(self, n: int) -> List[Optional[TreeNode]]:
66+
@cache
67+
def dfs(n):
68+
if n == 1:
69+
return [TreeNode()]
70+
res = []
71+
if n % 2:
72+
for i in range(n - 1):
73+
j = n - i - 1
74+
for left in dfs(i):
75+
for right in dfs(j):
76+
res.append(TreeNode(0, left, right))
77+
return res
78+
79+
return dfs(n)
5180
```
5281

5382
### **Java**
5483

5584
<!-- 这里可写当前语言的特殊实现逻辑 -->
5685

5786
```java
87+
/**
88+
* Definition for a binary tree node.
89+
* public class TreeNode {
90+
* int val;
91+
* TreeNode left;
92+
* TreeNode right;
93+
* TreeNode() {}
94+
* TreeNode(int val) { this.val = val; }
95+
* TreeNode(int val, TreeNode left, TreeNode right) {
96+
* this.val = val;
97+
* this.left = left;
98+
* this.right = right;
99+
* }
100+
* }
101+
*/
102+
class Solution {
103+
private List<TreeNode>[] f = new List[21];
104+
105+
public List<TreeNode> allPossibleFBT(int n) {
106+
return dfs(n);
107+
}
108+
109+
private List<TreeNode> dfs(int n) {
110+
if (f[n] != null) {
111+
return f[n];
112+
}
113+
if (n == 1) {
114+
return Collections.singletonList(new TreeNode());
115+
}
116+
List<TreeNode> res = new ArrayList<>();
117+
for (int i = 0; i < n - 1; ++i) {
118+
int j = n - i - 1;
119+
for (TreeNode left : dfs(i)) {
120+
for (TreeNode right : dfs(j)) {
121+
res.add(new TreeNode(0, left, right));
122+
}
123+
}
124+
}
125+
f[n] = res;
126+
return res;
127+
}
128+
}
129+
```
130+
131+
### **C++**
132+
133+
```cpp
134+
/**
135+
* Definition for a binary tree node.
136+
* struct TreeNode {
137+
* int val;
138+
* TreeNode *left;
139+
* TreeNode *right;
140+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
141+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
142+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
143+
* };
144+
*/
145+
class Solution {
146+
public:
147+
unordered_map<int, vector<TreeNode*>> f;
148+
149+
vector<TreeNode*> allPossibleFBT(int n) {
150+
return dfs(n);
151+
}
152+
153+
vector<TreeNode*> dfs(int n) {
154+
if (f.count(n)) return f[n];
155+
if (n == 1) return {new TreeNode()};
156+
vector<TreeNode*> res;
157+
for (int i = 0; i < n - 1; ++i) {
158+
int j = n - i - 1;
159+
for (auto left : dfs(i)) {
160+
for (auto right : dfs(j)) {
161+
res.push_back(new TreeNode(0, left, right));
162+
}
163+
}
164+
}
165+
f[n] = res;
166+
return res;
167+
}
168+
};
169+
```
58170
171+
### **Go**
172+
173+
```go
174+
/**
175+
* Definition for a binary tree node.
176+
* type TreeNode struct {
177+
* Val int
178+
* Left *TreeNode
179+
* Right *TreeNode
180+
* }
181+
*/
182+
func allPossibleFBT(n int) []*TreeNode {
183+
f := map[int][]*TreeNode{}
184+
var dfs func(n int) []*TreeNode
185+
dfs = func(n int) []*TreeNode {
186+
if v, ok := f[n]; ok {
187+
return v
188+
}
189+
if n == 1 {
190+
return []*TreeNode{&TreeNode{Val: 0}}
191+
}
192+
res := []*TreeNode{}
193+
for i := 0; i < n-1; i++ {
194+
j := n - i - 1
195+
for _, left := range dfs(i) {
196+
for _, right := range dfs(j) {
197+
res = append(res, &TreeNode{0, left, right})
198+
}
199+
}
200+
}
201+
f[n] = res
202+
return res
203+
}
204+
return dfs(n)
205+
}
59206
```
60207

61208
### **...**

solution/0800-0899/0894.All Possible Full Binary Trees/README_EN.md

Lines changed: 140 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,152 @@
3939
### **Python3**
4040

4141
```python
42-
42+
# Definition for a binary tree node.
43+
# class TreeNode:
44+
# def __init__(self, val=0, left=None, right=None):
45+
# self.val = val
46+
# self.left = left
47+
# self.right = right
48+
class Solution:
49+
def allPossibleFBT(self, n: int) -> List[Optional[TreeNode]]:
50+
@cache
51+
def dfs(n):
52+
if n == 1:
53+
return [TreeNode()]
54+
res = []
55+
if n % 2:
56+
for i in range(n - 1):
57+
j = n - i - 1
58+
for left in dfs(i):
59+
for right in dfs(j):
60+
res.append(TreeNode(0, left, right))
61+
return res
62+
63+
return dfs(n)
4364
```
4465

4566
### **Java**
4667

4768
```java
69+
/**
70+
* Definition for a binary tree node.
71+
* public class TreeNode {
72+
* int val;
73+
* TreeNode left;
74+
* TreeNode right;
75+
* TreeNode() {}
76+
* TreeNode(int val) { this.val = val; }
77+
* TreeNode(int val, TreeNode left, TreeNode right) {
78+
* this.val = val;
79+
* this.left = left;
80+
* this.right = right;
81+
* }
82+
* }
83+
*/
84+
class Solution {
85+
private List<TreeNode>[] f = new List[21];
86+
87+
public List<TreeNode> allPossibleFBT(int n) {
88+
return dfs(n);
89+
}
90+
91+
private List<TreeNode> dfs(int n) {
92+
if (f[n] != null) {
93+
return f[n];
94+
}
95+
if (n == 1) {
96+
return Collections.singletonList(new TreeNode());
97+
}
98+
List<TreeNode> res = new ArrayList<>();
99+
for (int i = 0; i < n - 1; ++i) {
100+
int j = n - i - 1;
101+
for (TreeNode left : dfs(i)) {
102+
for (TreeNode right : dfs(j)) {
103+
res.add(new TreeNode(0, left, right));
104+
}
105+
}
106+
}
107+
f[n] = res;
108+
return res;
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
/**
117+
* Definition for a binary tree node.
118+
* struct TreeNode {
119+
* int val;
120+
* TreeNode *left;
121+
* TreeNode *right;
122+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
123+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
124+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
125+
* };
126+
*/
127+
class Solution {
128+
public:
129+
unordered_map<int, vector<TreeNode*>> f;
130+
131+
vector<TreeNode*> allPossibleFBT(int n) {
132+
return dfs(n);
133+
}
134+
135+
vector<TreeNode*> dfs(int n) {
136+
if (f.count(n)) return f[n];
137+
if (n == 1) return {new TreeNode()};
138+
vector<TreeNode*> res;
139+
for (int i = 0; i < n - 1; ++i) {
140+
int j = n - i - 1;
141+
for (auto left : dfs(i)) {
142+
for (auto right : dfs(j)) {
143+
res.push_back(new TreeNode(0, left, right));
144+
}
145+
}
146+
}
147+
f[n] = res;
148+
return res;
149+
}
150+
};
151+
```
48152
153+
### **Go**
154+
155+
```go
156+
/**
157+
* Definition for a binary tree node.
158+
* type TreeNode struct {
159+
* Val int
160+
* Left *TreeNode
161+
* Right *TreeNode
162+
* }
163+
*/
164+
func allPossibleFBT(n int) []*TreeNode {
165+
f := map[int][]*TreeNode{}
166+
var dfs func(n int) []*TreeNode
167+
dfs = func(n int) []*TreeNode {
168+
if v, ok := f[n]; ok {
169+
return v
170+
}
171+
if n == 1 {
172+
return []*TreeNode{&TreeNode{Val: 0}}
173+
}
174+
res := []*TreeNode{}
175+
for i := 0; i < n-1; i++ {
176+
j := n - i - 1
177+
for _, left := range dfs(i) {
178+
for _, right := range dfs(j) {
179+
res = append(res, &TreeNode{0, left, right})
180+
}
181+
}
182+
}
183+
f[n] = res
184+
return res
185+
}
186+
return dfs(n)
187+
}
49188
```
50189

51190
### **...**
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
unordered_map<int, vector<TreeNode*>> f;
15+
16+
vector<TreeNode*> allPossibleFBT(int n) {
17+
return dfs(n);
18+
}
19+
20+
vector<TreeNode*> dfs(int n) {
21+
if (f.count(n)) return f[n];
22+
if (n == 1) return {new TreeNode()};
23+
vector<TreeNode*> res;
24+
for (int i = 0; i < n - 1; ++i) {
25+
int j = n - i - 1;
26+
for (auto left : dfs(i)) {
27+
for (auto right : dfs(j)) {
28+
res.push_back(new TreeNode(0, left, right));
29+
}
30+
}
31+
}
32+
f[n] = res;
33+
return res;
34+
}
35+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* type TreeNode struct {
4+
* Val int
5+
* Left *TreeNode
6+
* Right *TreeNode
7+
* }
8+
*/
9+
func allPossibleFBT(n int) []*TreeNode {
10+
f := map[int][]*TreeNode{}
11+
var dfs func(n int) []*TreeNode
12+
dfs = func(n int) []*TreeNode {
13+
if v, ok := f[n]; ok {
14+
return v
15+
}
16+
if n == 1 {
17+
return []*TreeNode{&TreeNode{Val: 0}}
18+
}
19+
res := []*TreeNode{}
20+
for i := 0; i < n-1; i++ {
21+
j := n - i - 1
22+
for _, left := range dfs(i) {
23+
for _, right := range dfs(j) {
24+
res = append(res, &TreeNode{0, left, right})
25+
}
26+
}
27+
}
28+
f[n] = res
29+
return res
30+
}
31+
return dfs(n)
32+
}

0 commit comments

Comments
 (0)