Skip to content

Commit a5b2ad7

Browse files
authored
feat: update solutions to lc/lcof2 problems (doocs#2882)
Serialize and Deserialize Binary Tree
1 parent 071989e commit a5b2ad7

File tree

19 files changed

+931
-1215
lines changed

19 files changed

+931
-1215
lines changed

lcof/面试题18. 删除链表的节点/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -256,15 +256,15 @@ class Solution {
256256
func deleteNode(_ head: ListNode?, _ val: Int) -> ListNode? {
257257
let dummy = ListNode(0, head)
258258
var current: ListNode? = dummy
259-
259+
260260
while current?.next != nil {
261261
if current?.next?.val == val {
262262
current?.next = current?.next?.next
263263
break
264264
}
265265
current = current?.next
266266
}
267-
267+
268268
return dummy.next
269269
}
270270
}

lcof/面试题21. 调整数组顺序使奇数位于偶数前面/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ class Solution {
189189
func exchange(_ nums: [Int]) -> [Int] {
190190
var nums = nums
191191
var j = 0
192-
192+
193193
for i in 0..<nums.count {
194194
if nums[i] % 2 == 1 {
195195
let temp = nums[i]
@@ -198,7 +198,7 @@ class Solution {
198198
j += 1
199199
}
200200
}
201-
201+
202202
return nums
203203
}
204204
}

lcof/面试题37. 序列化二叉树/README.md

+69-244
Original file line numberDiff line numberDiff line change
@@ -339,20 +339,23 @@ func (this *Codec) deserialize(data string) *TreeNode {
339339
* @return {string}
340340
*/
341341
var serialize = function (root) {
342-
if (!root) return '[]';
343-
let queue = [root];
344-
let res = '';
345-
while (queue.length) {
346-
let node = queue.shift();
347-
if (node) {
348-
res += node.val + ',';
349-
queue.push(node.left);
350-
queue.push(node.right);
342+
if (root === null) {
343+
return null;
344+
}
345+
const ans = [];
346+
const q = [root];
347+
let index = 0;
348+
while (index < q.length) {
349+
const node = q[index++];
350+
if (node !== null) {
351+
ans.push(node.val.toString());
352+
q.push(node.left);
353+
q.push(node.right);
351354
} else {
352-
res += 'null' + ',';
355+
ans.push('#');
353356
}
354357
}
355-
return `[${res.substring(0, res.length - 1)}]`;
358+
return ans.join(',');
356359
};
357360

358361
/**
@@ -362,22 +365,26 @@ var serialize = function (root) {
362365
* @return {TreeNode}
363366
*/
364367
var deserialize = function (data) {
365-
if (!data || data.length <= 2) return null;
366-
let arr = data.substring(1, data.length - 1).split(',');
367-
let root = new TreeNode(arr.shift());
368-
let queue = [root];
369-
while (queue.length) {
370-
let node = queue.shift();
371-
let leftVal = arr.shift();
372-
if (leftVal !== 'null') {
373-
node.left = new TreeNode(leftVal);
374-
queue.push(node.left);
368+
if (data === null) {
369+
return null;
370+
}
371+
const vals = data.split(',');
372+
let i = 0;
373+
const root = new TreeNode(parseInt(vals[i++]));
374+
const q = [root];
375+
let index = 0;
376+
while (index < q.length) {
377+
const node = q[index++];
378+
if (vals[i] !== '#') {
379+
node.left = new TreeNode(+vals[i]);
380+
q.push(node.left);
375381
}
376-
let rightVal = arr.shift();
377-
if (rightVal !== 'null') {
378-
node.right = new TreeNode(rightVal);
379-
queue.push(node.right);
382+
i++;
383+
if (vals[i] !== '#') {
384+
node.right = new TreeNode(+vals[i]);
385+
q.push(node.right);
380386
}
387+
i++;
381388
}
382389
return root;
383390
};
@@ -401,239 +408,57 @@ var deserialize = function (data) {
401408
* }
402409
*/
403410
public class Codec {
404-
public string serialize(TreeNode root) {
405-
return rserialize(root, "");
406-
}
407-
408-
public TreeNode deserialize(string data) {
409-
string[] dataArray = data.Split(",");
410-
LinkedList<string> dataList = new LinkedList<string>(dataArray.ToList());
411-
return rdeserialize(dataList);
412-
}
413411

414-
public string rserialize(TreeNode root, string str) {
412+
// Encodes a tree to a single string.
413+
public string serialize(TreeNode root) {
415414
if (root == null) {
416-
str += "None,";
417-
} else {
418-
str += root.val.ToString() + ",";
419-
str = rserialize(root.left, str);
420-
str = rserialize(root.right, str);
421-
}
422-
return str;
423-
}
424-
425-
public TreeNode rdeserialize(LinkedList<string> dataList) {
426-
if (dataList.First.Value.Equals("None")) {
427-
dataList.RemoveFirst();
428415
return null;
429416
}
430-
431-
TreeNode root = new TreeNode(int.Parse(dataList.First.Value));
432-
dataList.RemoveFirst();
433-
root.left = rdeserialize(dataList);
434-
root.right = rdeserialize(dataList);
435-
436-
return root;
437-
}
438-
}
439-
440-
// Your Codec object will be instantiated and called as such:
441-
// Codec codec = new Codec();
442-
// codec.deserialize(codec.serialize(root));
443-
```
444-
445-
<!-- tabs:end -->
446-
447-
<!-- solution:end -->
448-
449-
<!-- solution:start-->
450-
451-
### 方法二:前序遍历
452-
453-
当二叉树的前中后序列不包含叶子节点时需要前中、前后、中后三种组合方式之一才能确定一颗二叉树,但当前序和后序遍历序列中包含叶子节点时,可以仅通过前序或后序遍历序列构建一颗二叉树。
454-
455-
在前序遍历序列化时,我们以任意特殊字符表示叶子节点,返回序列化后的字符串;反序列化时对序列化字符串根据分隔符进行切分后使用列表的第一个元素作为二叉树的根节点,然后利用列表的其他元素递归生成左右子树即可。
456-
457-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点个数。
458-
459-
<!-- tabs:start -->
460-
461-
#### C++
462-
463-
```cpp
464-
/**
465-
* Definition for a binary tree node.
466-
* struct TreeNode {
467-
* int val;
468-
* TreeNode *left;
469-
* TreeNode *right;
470-
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
471-
* };
472-
*/
473-
class Codec {
474-
public:
475-
string empty = "#";
476-
string sep = ",";
477-
// Encodes a tree to a single string.
478-
string serialize(TreeNode* root) {
479-
if (!root) return empty + sep;
480-
string res = to_string(root->val) + sep;
481-
res += serialize(root->left);
482-
res += serialize(root->right);
483-
return res;
484-
}
485-
486-
// Decodes your encoded data to tree.
487-
TreeNode* deserialize(string data) {
488-
list<string> nodes;
489-
size_t pos = 0;
490-
string node;
491-
while ((pos = data.find(sep)) != string::npos) {
492-
node = data.substr(0, pos);
493-
nodes.push_back(node);
494-
data.erase(0, pos + sep.length());
417+
List<string> ans = new List<string>();
418+
Queue<TreeNode> q = new Queue<TreeNode>();
419+
q.Enqueue(root);
420+
while (q.Count > 0) {
421+
TreeNode node = q.Dequeue();
422+
if (node != null) {
423+
ans.Add(node.val.ToString());
424+
q.Enqueue(node.left);
425+
q.Enqueue(node.right);
426+
} else {
427+
ans.Add("#");
428+
}
495429
}
496-
return deserialize(nodes);
497-
}
498-
499-
TreeNode* deserialize(list<string>& data) {
500-
if (data.empty()) return nullptr;
501-
string first = data.front();
502-
data.pop_front();
503-
if (first == empty) return nullptr;
504-
TreeNode* root = new TreeNode(stoi(first));
505-
root->left = deserialize(data);
506-
root->right = deserialize(data);
507-
return root;
508-
}
509-
};
510-
511-
// Your Codec object will be instantiated and called as such:
512-
// Codec codec;
513-
// codec.deserialize(codec.serialize(root));
514-
```
515-
516-
#### JavaScript
517-
518-
```js
519-
/**
520-
* Definition for a binary tree node.
521-
* function TreeNode(val) {
522-
* this.val = val;
523-
* this.left = this.right = null;
524-
* }
525-
*/
526-
527-
/**
528-
* Encodes a tree to a single string.
529-
*
530-
* @param {TreeNode} root
531-
* @return {string}
532-
*/
533-
var serialize = function (root) {
534-
if (root == null) {
535-
return '#';
430+
return string.Join(",", ans);
536431
}
537-
const { val, left, right } = root;
538-
return `${val},${serialize(left)},${serialize(right)}`;
539-
};
540432

541-
/**
542-
* Decodes your encoded data to tree.
543-
*
544-
* @param {string} data
545-
* @return {TreeNode}
546-
*/
547-
var deserialize = function (data) {
548-
const vals = data.split(',');
549-
let index = 0;
550-
const dfs = () => {
551-
if (vals[index] == '#') {
552-
index++;
433+
// Decodes your encoded data to tree.
434+
public TreeNode deserialize(string data) {
435+
if (data == null) {
553436
return null;
554437
}
555-
const res = new TreeNode(vals[index++]);
556-
res.left = dfs();
557-
res.right = dfs();
558-
return res;
559-
};
560-
return dfs();
561-
};
562-
563-
/**
564-
* Your functions will be called as such:
565-
* deserialize(serialize(root));
566-
*/
567-
```
568-
569-
<!-- tabs:end -->
570-
571-
<!-- solution:end -->
572-
573-
<!-- solution:start-->
574-
575-
### 方法三:后序遍历
576-
577-
在后序遍历序列化时,我们以任意特殊字符表示叶子节点,返回序列化后的字符串;反序列化时对序列化字符串根据分隔符进行切分后使用列表的最后一个元素作为二叉树的根节点,然后利用列表的其他元素递归生成左右子树即可。
578-
579-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点个数。
580-
581-
<!-- tabs:start -->
582-
583-
#### C++
584-
585-
```cpp
586-
/**
587-
* Definition for a binary tree node.
588-
* struct TreeNode {
589-
* int val;
590-
* TreeNode *left;
591-
* TreeNode *right;
592-
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
593-
* };
594-
*/
595-
class Codec {
596-
public:
597-
string empty = "#";
598-
string sep = ",";
599-
// Encodes a tree to a single string.
600-
string serialize(TreeNode* root) {
601-
if (!root) return empty + sep;
602-
string res = "";
603-
res += serialize(root->left);
604-
res += serialize(root->right);
605-
res += to_string(root->val) + sep;
606-
return res;
607-
}
608-
609-
// Decodes your encoded data to tree.
610-
TreeNode* deserialize(string data) {
611-
vector<string> nodes;
612-
size_t pos = 0;
613-
string node;
614-
while ((pos = data.find(sep)) != string::npos) {
615-
node = data.substr(0, pos);
616-
nodes.push_back(node);
617-
data.erase(0, pos + sep.length());
438+
string[] vals = data.Split(',');
439+
int i = 0;
440+
TreeNode root = new TreeNode(int.Parse(vals[i++]));
441+
Queue<TreeNode> q = new Queue<TreeNode>();
442+
q.Enqueue(root);
443+
while (q.Count > 0) {
444+
TreeNode node = q.Dequeue();
445+
if (vals[i] != "#") {
446+
node.left = new TreeNode(int.Parse(vals[i]));
447+
q.Enqueue(node.left);
448+
}
449+
i++;
450+
if (vals[i] != "#") {
451+
node.right = new TreeNode(int.Parse(vals[i]));
452+
q.Enqueue(node.right);
453+
}
454+
i++;
618455
}
619-
return deserialize(nodes);
620-
}
621-
622-
TreeNode* deserialize(vector<string>& nodes) {
623-
if (nodes.empty()) return nullptr;
624-
string front = nodes.back();
625-
nodes.pop_back();
626-
if (front == empty) return nullptr;
627-
TreeNode* root = new TreeNode(stoi(front));
628-
// 先构造右子树,后构造左子树
629-
root->right = deserialize(nodes);
630-
root->left = deserialize(nodes);
631456
return root;
632457
}
633-
};
458+
}
634459

635460
// Your Codec object will be instantiated and called as such:
636-
// Codec codec;
461+
// Codec codec = new Codec();
637462
// codec.deserialize(codec.serialize(root));
638463
```
639464

0 commit comments

Comments
 (0)