Skip to content

Commit dee676e

Browse files
authored
feat: add solutions to lc problem: No.0431 (#3602)
No.0431.Encode N-ary Tree to Binary Tree
1 parent eb6ca64 commit dee676e

File tree

13 files changed

+1020
-19
lines changed

13 files changed

+1020
-19
lines changed

solution/0400-0499/0431.Encode N-ary Tree to Binary Tree/README.md

+335-4
Original file line numberDiff line numberDiff line change
@@ -76,32 +76,363 @@ tags:
7676

7777
<!-- solution:start -->
7878

79-
### 方法一
79+
### 方法一:递归
80+
81+
我们可以将二叉树的左指针指向 N 叉树的第一个孩子,将二叉树的右指针指向 N 叉树的下一个兄弟节点。
82+
83+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为 N 叉树的节点数量。
8084

8185
<!-- tabs:start -->
8286

8387
#### Python3
8488

8589
```python
86-
90+
"""
91+
# Definition for a Node.
92+
class Node:
93+
def __init__(self, val: Optional[int] = None, children: Optional[List['Node']] = None):
94+
self.val = val
95+
self.children = children
96+
"""
97+
98+
"""
99+
# Definition for a binary tree node.
100+
class TreeNode:
101+
def __init__(self, x):
102+
self.val = x
103+
self.left = None
104+
self.right = None
105+
"""
106+
107+
108+
class Codec:
109+
# Encodes an n-ary tree to a binary tree.
110+
def encode(self, root: "Optional[Node]") -> Optional[TreeNode]:
111+
if root is None:
112+
return None
113+
node = TreeNode(root.val)
114+
if not root.children:
115+
return node
116+
left = self.encode(root.children[0])
117+
node.left = left
118+
for child in root.children[1:]:
119+
left.right = self.encode(child)
120+
left = left.right
121+
return node
122+
123+
# Decodes your binary tree to an n-ary tree.
124+
def decode(self, data: Optional[TreeNode]) -> "Optional[Node]":
125+
if data is None:
126+
return None
127+
node = Node(data.val, [])
128+
if data.left is None:
129+
return node
130+
left = data.left
131+
while left:
132+
node.children.append(self.decode(left))
133+
left = left.right
134+
return node
135+
136+
137+
# Your Codec object will be instantiated and called as such:
138+
# codec = Codec()
139+
# codec.decode(codec.encode(root))
87140
```
88141

89142
#### Java
90143

91144
```java
92-
145+
/*
146+
// Definition for a Node.
147+
class Node {
148+
public int val;
149+
public List<Node> children;
150+
151+
public Node() {}
152+
153+
public Node(int _val) {
154+
val = _val;
155+
}
156+
157+
public Node(int _val, List<Node> _children) {
158+
val = _val;
159+
children = _children;
160+
}
161+
};
162+
*/
163+
164+
/**
165+
* Definition for a binary tree node.
166+
* public class TreeNode {
167+
* int val;
168+
* TreeNode left;
169+
* TreeNode right;
170+
* TreeNode(int x) { val = x; }
171+
* }
172+
*/
173+
174+
class Codec {
175+
// Encodes an n-ary tree to a binary tree.
176+
public TreeNode encode(Node root) {
177+
if (root == null) {
178+
return null;
179+
}
180+
TreeNode node = new TreeNode(root.val);
181+
if (root.children == null || root.children.isEmpty()) {
182+
return node;
183+
}
184+
TreeNode left = encode(root.children.get(0));
185+
node.left = left;
186+
for (int i = 1; i < root.children.size(); i++) {
187+
left.right = encode(root.children.get(i));
188+
left = left.right;
189+
}
190+
return node;
191+
}
192+
193+
// Decodes your binary tree to an n-ary tree.
194+
public Node decode(TreeNode data) {
195+
if (data == null) {
196+
return null;
197+
}
198+
Node node = new Node(data.val, new ArrayList<>());
199+
if (data.left == null) {
200+
return node;
201+
}
202+
TreeNode left = data.left;
203+
while (left != null) {
204+
node.children.add(decode(left));
205+
left = left.right;
206+
}
207+
return node;
208+
}
209+
}
210+
211+
// Your Codec object will be instantiated and called as such:
212+
// Codec codec = new Codec();
213+
// codec.decode(codec.encode(root));
93214
```
94215

95216
#### C++
96217

97218
```cpp
98-
219+
/*
220+
// Definition for a Node.
221+
class Node {
222+
public:
223+
int val;
224+
vector<Node*> children;
225+
226+
Node() {}
227+
228+
Node(int _val) {
229+
val = _val;
230+
}
231+
232+
Node(int _val, vector<Node*> _children) {
233+
val = _val;
234+
children = _children;
235+
}
236+
};
237+
*/
238+
239+
/**
240+
* Definition for a binary tree node.
241+
* struct TreeNode {
242+
* int val;
243+
* TreeNode *left;
244+
* TreeNode *right;
245+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
246+
* };
247+
*/
248+
249+
class Codec {
250+
public:
251+
// Encodes an n-ary tree to a binary tree.
252+
TreeNode* encode(Node* root) {
253+
if (root == nullptr) {
254+
return nullptr;
255+
}
256+
TreeNode* node = new TreeNode(root->val);
257+
if (root->children.empty()) {
258+
return node;
259+
}
260+
TreeNode* left = encode(root->children[0]);
261+
node->left = left;
262+
for (int i = 1; i < root->children.size(); i++) {
263+
left->right = encode(root->children[i]);
264+
left = left->right;
265+
}
266+
return node;
267+
}
268+
269+
// Decodes your binary tree to an n-ary tree.
270+
Node* decode(TreeNode* data) {
271+
if (data == nullptr) {
272+
return nullptr;
273+
}
274+
Node* node = new Node(data->val, vector<Node*>());
275+
if (data->left == nullptr) {
276+
return node;
277+
}
278+
TreeNode* left = data->left;
279+
while (left != nullptr) {
280+
node->children.push_back(decode(left));
281+
left = left->right;
282+
}
283+
return node;
284+
}
285+
};
286+
287+
// Your Codec object will be instantiated and called as such:
288+
// Codec codec;
289+
// codec.decode(codec.encode(root));
99290
```
100291

101292
#### Go
102293

103294
```go
295+
/**
296+
* Definition for a Node.
297+
* type Node struct {
298+
* Val int
299+
* Children []*Node
300+
* }
301+
*/
302+
303+
/**
304+
* Definition for a binary tree node.
305+
* type TreeNode struct {
306+
* Val int
307+
* Left *TreeNode
308+
* Right *TreeNode
309+
* }
310+
*/
311+
312+
type Codec struct {
313+
}
314+
315+
func Constructor() *Codec {
316+
return &Codec{}
317+
}
318+
319+
// Encodes an n-ary tree to a binary tree.
320+
func (this *Codec) encode(root *Node) *TreeNode {
321+
if root == nil {
322+
return nil
323+
}
324+
node := &TreeNode{Val: root.Val}
325+
if len(root.Children) == 0 {
326+
return node
327+
}
328+
left := this.encode(root.Children[0])
329+
node.Left = left
330+
for i := 1; i < len(root.Children); i++ {
331+
left.Right = this.encode(root.Children[i])
332+
left = left.Right
333+
}
334+
return node
335+
}
336+
337+
// Decodes your binary tree to an n-ary tree.
338+
func (this *Codec) decode(data *TreeNode) *Node {
339+
if data == nil {
340+
return nil
341+
}
342+
node := &Node{Val: data.Val, Children: []*Node{}}
343+
if data.Left == nil {
344+
return node
345+
}
346+
left := data.Left
347+
for left != nil {
348+
node.Children = append(node.Children, this.decode(left))
349+
left = left.Right
350+
}
351+
return node
352+
}
353+
354+
/**
355+
* Your Codec object will be instantiated and called as such:
356+
* obj := Constructor();
357+
* bst := obj.encode(root);
358+
* ans := obj.decode(bst);
359+
*/
360+
```
104361

362+
#### TypeScript
363+
364+
```ts
365+
/**
366+
* Definition for _Node.
367+
* class _Node {
368+
* val: number
369+
* children: _Node[]
370+
*
371+
* constructor(v: number) {
372+
* this.val = v;
373+
* this.children = [];
374+
* }
375+
* }
376+
*/
377+
378+
/**
379+
* Definition for a binary tree node.
380+
* class TreeNode {
381+
* val: number
382+
* left: TreeNode | null
383+
* right: TreeNode | null
384+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
385+
* this.val = (val===undefined ? 0 : val)
386+
* this.left = (left===undefined ? null : left)
387+
* this.right = (right===undefined ? null : right)
388+
* }
389+
* }
390+
*/
391+
392+
class Codec {
393+
constructor() {}
394+
395+
// Encodes an n-ary tree to a binary tree.
396+
serialize(root: _Node | null): TreeNode | null {
397+
if (root === null) {
398+
return null;
399+
}
400+
const node = new TreeNode(root.val);
401+
if (root.children.length === 0) {
402+
return node;
403+
}
404+
let left: TreeNode | null = this.serialize(root.children[0]);
405+
node.left = left;
406+
for (let i = 1; i < root.children.length; i++) {
407+
if (left) {
408+
left.right = this.serialize(root.children[i]);
409+
left = left.right;
410+
}
411+
}
412+
return node;
413+
}
414+
415+
// Decodes your binary tree back to an n-ary tree.
416+
deserialize(root: TreeNode | null): _Node | null {
417+
if (root === null) {
418+
return null;
419+
}
420+
const node = new _Node(root.val);
421+
if (root.left === null) {
422+
return node;
423+
}
424+
let left: TreeNode | null = root.left;
425+
while (left !== null) {
426+
node.children.push(this.deserialize(left));
427+
left = left.right;
428+
}
429+
return node;
430+
}
431+
}
432+
433+
// Your Codec object will be instantiated and called as such:
434+
// Codec codec = new Codec();
435+
// codec.deserialize(codec.serialize(root));
105436
```
106437

107438
<!-- tabs:end -->

0 commit comments

Comments
 (0)