Skip to content

Commit da4c1f1

Browse files
committed
feat: add python and java solutions to lcof question
添加《剑指 Offer》题解:面试题37. 序列化二叉树
1 parent 089e20d commit da4c1f1

File tree

5 files changed

+308
-5
lines changed

5 files changed

+308
-5
lines changed

lcci/summary.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
- 程序员面试金典题解
1+
- 程序员面试金典(第 6 版)题解
22
- [01.01. 判定字符是否唯一](/lcci/01.01.Is%20Unique/README.md)
33
- [01.02. 判定是否互为字符重排](/lcci/01.02.Check%20Permutation/README.md)
44
- [01.03. URL化](/lcci/01.03.String%20to%20URL/README.md)

lcof/summary.md

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
- 剑指 Offer 题解
1+
- 剑指 Offer(第 2 版)题解
22
- [03. 数组中重复的数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9803.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E9%87%8D%E5%A4%8D%E7%9A%84%E6%95%B0%E5%AD%97/README.md)
33
- [04. 二维数组中的查找](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9804.%20%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%9F%A5%E6%89%BE/README.md)
44
- [05. 替换空格](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9805.%20%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC/README.md)
@@ -17,6 +17,7 @@
1717
- [17. 打印从1到最大的n位数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9817.%20%E6%89%93%E5%8D%B0%E4%BB%8E1%E5%88%B0%E6%9C%80%E5%A4%A7%E7%9A%84n%E4%BD%8D%E6%95%B0/README.md)
1818
- [18. 删除链表的节点](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9818.%20%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E8%8A%82%E7%82%B9/README.md)
1919
- [19. 正则表达式匹配](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9819.%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%B9%E9%85%8D/README.md)
20+
- [20. 表示数值的字符串](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9820.%20%E8%A1%A8%E7%A4%BA%E6%95%B0%E5%80%BC%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2/README.md)
2021
- [21. 调整数组顺序使奇数位于偶数前面](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9821.%20%E8%B0%83%E6%95%B4%E6%95%B0%E7%BB%84%E9%A1%BA%E5%BA%8F%E4%BD%BF%E5%A5%87%E6%95%B0%E4%BD%8D%E4%BA%8E%E5%81%B6%E6%95%B0%E5%89%8D%E9%9D%A2/README.md)
2122
- [22. 链表中倒数第k个节点](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9822.%20%E9%93%BE%E8%A1%A8%E4%B8%AD%E5%80%92%E6%95%B0%E7%AC%ACk%E4%B8%AA%E8%8A%82%E7%82%B9/README.md)
2223
- [24. 反转链表](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9824.%20%E5%8F%8D%E8%BD%AC%E9%93%BE%E8%A1%A8/README.md)
@@ -33,29 +34,43 @@
3334
- [33. 二叉搜索树的后序遍历序列](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9833.%20%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97/README.md)
3435
- [34. 二叉树中和为某一值的路径](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9834.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%92%8C%E4%B8%BA%E6%9F%90%E4%B8%80%E5%80%BC%E7%9A%84%E8%B7%AF%E5%BE%84/README.md)
3536
- [35. 复杂链表的复制](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9835.%20%E5%A4%8D%E6%9D%82%E9%93%BE%E8%A1%A8%E7%9A%84%E5%A4%8D%E5%88%B6/README.md)
37+
- [36. 二叉搜索树与双向链表](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9836.%20%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%8E%E5%8F%8C%E5%90%91%E9%93%BE%E8%A1%A8/README.md)
38+
- [37. 序列化二叉树](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9837.%20%E5%BA%8F%E5%88%97%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91/README.md)
39+
- [38. 字符串的排列](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9838.%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%8E%92%E5%88%97/README.md)
3640
- [39. 数组中出现次数超过一半的数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9839.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E5%87%BA%E7%8E%B0%E6%AC%A1%E6%95%B0%E8%B6%85%E8%BF%87%E4%B8%80%E5%8D%8A%E7%9A%84%E6%95%B0%E5%AD%97/README.md)
3741
- [40. 最小的k个数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9840.%20%E6%9C%80%E5%B0%8F%E7%9A%84k%E4%B8%AA%E6%95%B0/README.md)
42+
- [41. 数据流中的中位数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9841.%20%E6%95%B0%E6%8D%AE%E6%B5%81%E4%B8%AD%E7%9A%84%E4%B8%AD%E4%BD%8D%E6%95%B0/README.md)
3843
- [42. 连续子数组的最大和](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9842.%20%E8%BF%9E%E7%BB%AD%E5%AD%90%E6%95%B0%E7%BB%84%E7%9A%84%E6%9C%80%E5%A4%A7%E5%92%8C/README.md)
44+
- [43. 1~n整数中1出现的次数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9843.%201%EF%BD%9En%E6%95%B4%E6%95%B0%E4%B8%AD1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md)
45+
- [44. 数字序列中某一位的数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9844.%20%E6%95%B0%E5%AD%97%E5%BA%8F%E5%88%97%E4%B8%AD%E6%9F%90%E4%B8%80%E4%BD%8D%E7%9A%84%E6%95%B0%E5%AD%97/README.md)
3946
- [45. 把数组排成最小的数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9845.%20%E6%8A%8A%E6%95%B0%E7%BB%84%E6%8E%92%E6%88%90%E6%9C%80%E5%B0%8F%E7%9A%84%E6%95%B0/README.md)
47+
- [46. 把数字翻译成字符串](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9846.%20%E6%8A%8A%E6%95%B0%E5%AD%97%E7%BF%BB%E8%AF%91%E6%88%90%E5%AD%97%E7%AC%A6%E4%B8%B2/README.md)
4048
- [47. 礼物的最大价值](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9847.%20%E7%A4%BC%E7%89%A9%E7%9A%84%E6%9C%80%E5%A4%A7%E4%BB%B7%E5%80%BC/README.md)
4149
- [48. 最长不含重复字符的子字符串](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9848.%20%E6%9C%80%E9%95%BF%E4%B8%8D%E5%90%AB%E9%87%8D%E5%A4%8D%E5%AD%97%E7%AC%A6%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2/README.md)
4250
- [49. 丑数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9849.%20%E4%B8%91%E6%95%B0/README.md)
4351
- [50. 第一个只出现一次的字符](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9850.%20%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%AA%E5%87%BA%E7%8E%B0%E4%B8%80%E6%AC%A1%E7%9A%84%E5%AD%97%E7%AC%A6/README.md)
4452
- [51. 数组中的逆序对](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9851.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E9%80%86%E5%BA%8F%E5%AF%B9/README.md)
4553
- [52. 两个链表的第一个公共节点](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9852.%20%E4%B8%A4%E4%B8%AA%E9%93%BE%E8%A1%A8%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%85%AC%E5%85%B1%E8%8A%82%E7%82%B9/README.md)
46-
- [53 - I. 在排序数组中查找数字 I](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9853%20-%20I.%20%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%95%B0%E5%AD%97%20I/README.md)
47-
- [53 - II. 0~n-1中缺失的数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9853%20-%20II.%200%EF%BD%9En-1%E4%B8%AD%E7%BC%BA%E5%A4%B1%E7%9A%84%E6%95%B0%E5%AD%97/README.md)
54+
- [53 - I. 在排序数组中查找数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9853%20-%20I.%20%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%95%B0%E5%AD%97/README.md)
55+
- [53 - II. 缺失的数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9853%20-%20II.%20%E7%BC%BA%E5%A4%B1%E7%9A%84%E6%95%B0%E5%AD%97/README.md)
4856
- [54. 二叉搜索树的第k大节点](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9854.%20%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E7%AC%ACk%E5%A4%A7%E8%8A%82%E7%82%B9/README.md)
4957
- [55 - I. 二叉树的深度](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9855%20-%20I.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%B7%B1%E5%BA%A6/README.md)
5058
- [55 - II. 平衡二叉树](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9855%20-%20II.%20%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91/README.md)
5159
- [56 - I. 数组中数字出现的次数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9856%20-%20I.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E6%95%B0%E5%AD%97%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md)
5260
- [56 - II. 数组中数字出现的次数 II](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9856%20-%20II.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E6%95%B0%E5%AD%97%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0%20II/README.md)
53-
- [57 - II. 和为s的连续正数序列](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9857%20-%20II.%20%E5%92%8C%E4%B8%BAs%E7%9A%84%E8%BF%9E%E7%BB%AD%E6%AD%A3%E6%95%B0%E5%BA%8F%E5%88%97/README.md)
5461
- [57. 和为s的两个数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9857.%20%E5%92%8C%E4%B8%BAs%E7%9A%84%E4%B8%A4%E4%B8%AA%E6%95%B0%E5%AD%97/README.md)
62+
- [57 - II. 和为s的连续正数序列](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9857%20-%20II.%20%E5%92%8C%E4%B8%BAs%E7%9A%84%E8%BF%9E%E7%BB%AD%E6%AD%A3%E6%95%B0%E5%BA%8F%E5%88%97/README.md)
5563
- [58 - I. 翻转单词顺序](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9858%20-%20I.%20%E7%BF%BB%E8%BD%AC%E5%8D%95%E8%AF%8D%E9%A1%BA%E5%BA%8F/README.md)
5664
- [58 - II. 左旋转字符串](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9858%20-%20II.%20%E5%B7%A6%E6%97%8B%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2/README.md)
65+
- [59 - I. 滑动窗口的最大值](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9859%20-%20I.%20%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E7%9A%84%E6%9C%80%E5%A4%A7%E5%80%BC/README.md)
66+
- [59 - II. 队列的最大值](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9859%20-%20II.%20%E9%98%9F%E5%88%97%E7%9A%84%E6%9C%80%E5%A4%A7%E5%80%BC/README.md)
67+
- [60. n个骰子的点数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9860.%20n%E4%B8%AA%E9%AA%B0%E5%AD%90%E7%9A%84%E7%82%B9%E6%95%B0/README.md)
68+
- [61. 扑克牌中的顺子](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9861.%20%E6%89%91%E5%85%8B%E7%89%8C%E4%B8%AD%E7%9A%84%E9%A1%BA%E5%AD%90/README.md)
69+
- [62. 圆圈中最后剩下的数字](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9862.%20%E5%9C%86%E5%9C%88%E4%B8%AD%E6%9C%80%E5%90%8E%E5%89%A9%E4%B8%8B%E7%9A%84%E6%95%B0%E5%AD%97/README.md)
5770
- [63. 股票的最大利润](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9863.%20%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E5%A4%A7%E5%88%A9%E6%B6%A6/README.md)
5871
- [64. 求1+2+…+n](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9864.%20%E6%B1%821%2B2%2B%E2%80%A6%2Bn/README.md)
72+
- [65. 不用加减乘除做加法](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9865.%20%E4%B8%8D%E7%94%A8%E5%8A%A0%E5%87%8F%E4%B9%98%E9%99%A4%E5%81%9A%E5%8A%A0%E6%B3%95/README.md)
73+
- [66. 构建乘积数组](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9866.%20%E6%9E%84%E5%BB%BA%E4%B9%98%E7%A7%AF%E6%95%B0%E7%BB%84/README.md)
5974
- [67. 把字符串转换成整数](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9867.%20%E6%8A%8A%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%8D%A2%E6%88%90%E6%95%B4%E6%95%B0/README.md)
6075
- [68 - I. 二叉搜索树的最近公共祖先](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9868%20-%20I.%20%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88/README.md)
6176
- [68 - II. 二叉树的最近公共祖先](/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9868%20-%20II.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88/README.md)
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
# [面试题37. 序列化二叉树](https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/)
2+
3+
## 题目描述
4+
<!-- 这里写题目描述 -->
5+
请实现两个函数,分别用来序列化和反序列化二叉树。
6+
7+
**示例:**
8+
9+
```
10+
你可以将以下二叉树:
11+
12+
1
13+
/ \
14+
2 3
15+
/ \
16+
4 5
17+
18+
序列化为 "[1,2,3,null,null,4,5]"
19+
```
20+
21+
注意:本题与主站 297 题相同:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/
22+
23+
## 解法
24+
<!-- 这里可写通用的实现逻辑 -->
25+
层次遍历解决。
26+
27+
### Python3
28+
<!-- 这里可写当前语言的特殊实现逻辑 -->
29+
30+
```python
31+
# Definition for a binary tree node.
32+
# class TreeNode(object):
33+
# def __init__(self, x):
34+
# self.val = x
35+
# self.left = None
36+
# self.right = None
37+
38+
class Codec:
39+
40+
def serialize(self, root):
41+
"""Encodes a tree to a single string.
42+
43+
:type root: TreeNode
44+
:rtype: str
45+
"""
46+
if not root:
47+
return '[]'
48+
queue = collections.deque()
49+
queue.append(root)
50+
res = []
51+
while queue:
52+
node = queue.popleft()
53+
if node:
54+
res.append(str(node.val))
55+
queue.append(node.left)
56+
queue.append(node.right)
57+
else:
58+
res.append('null')
59+
return f'[{",".join(res)}]'
60+
61+
62+
def deserialize(self, data):
63+
"""Decodes your encoded data to tree.
64+
65+
:type data: str
66+
:rtype: TreeNode
67+
"""
68+
if not data or data == '[]':
69+
return None
70+
queue = collections.deque()
71+
nodes = data[1:-1].split(',')
72+
root = TreeNode(nodes[0])
73+
queue.append(root)
74+
idx = 1
75+
while queue and idx < len(nodes):
76+
node = queue.popleft()
77+
if nodes[idx] != 'null':
78+
node.left = TreeNode(nodes[idx])
79+
queue.append(node.left)
80+
idx += 1
81+
if nodes[idx] != 'null':
82+
node.right = TreeNode(nodes[idx])
83+
queue.append(node.right)
84+
idx += 1
85+
return root
86+
87+
88+
# Your Codec object will be instantiated and called as such:
89+
# codec = Codec()
90+
# codec.deserialize(codec.serialize(root))
91+
```
92+
93+
### Java
94+
<!-- 这里可写当前语言的特殊实现逻辑 -->
95+
96+
```java
97+
/**
98+
* Definition for a binary tree node.
99+
* public class TreeNode {
100+
* int val;
101+
* TreeNode left;
102+
* TreeNode right;
103+
* TreeNode(int x) { val = x; }
104+
* }
105+
*/
106+
public class Codec {
107+
108+
// Encodes a tree to a single string.
109+
public String serialize(TreeNode root) {
110+
if (root == null) {
111+
return "[]";
112+
}
113+
StringBuilder sb = new StringBuilder("[");
114+
Queue<TreeNode> queue = new LinkedList<>();
115+
queue.offer(root);
116+
while (!queue.isEmpty()) {
117+
TreeNode node = queue.poll();
118+
if (node != null) {
119+
sb.append(node.val);
120+
queue.offer(node.left);
121+
queue.offer(node.right);
122+
} else {
123+
sb.append("null");
124+
}
125+
sb.append(",");
126+
}
127+
return sb.deleteCharAt(sb.length() - 1).append("]").toString();
128+
}
129+
130+
// Decodes your encoded data to tree.
131+
public TreeNode deserialize(String data) {
132+
if (data == null || "[]".equals(data)) {
133+
return null;
134+
}
135+
String[] nodes = data.substring(1, data.length() - 1).split(",");
136+
Queue<TreeNode> queue = new LinkedList<>();
137+
TreeNode root = new TreeNode(Integer.parseInt(nodes[0]));
138+
queue.offer(root);
139+
int idx = 1;
140+
while (!queue.isEmpty() && idx < nodes.length) {
141+
TreeNode node = queue.poll();
142+
if (!"null".equals(nodes[idx])) {
143+
node.left = new TreeNode(Integer.parseInt(nodes[idx]));
144+
queue.offer(node.left);
145+
}
146+
++idx;
147+
if (!"null".equals(nodes[idx])) {
148+
node.right = new TreeNode(Integer.parseInt(nodes[idx]));
149+
queue.offer(node.right);
150+
}
151+
++idx;
152+
}
153+
return root;
154+
}
155+
}
156+
157+
// Your Codec object will be instantiated and called as such:
158+
// Codec codec = new Codec();
159+
// codec.deserialize(codec.serialize(root));
160+
```
161+
162+
### ...
163+
```
164+
165+
```
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode(int x) { val = x; }
8+
* }
9+
*/
10+
public class Codec {
11+
12+
// Encodes a tree to a single string.
13+
public String serialize(TreeNode root) {
14+
if (root == null) {
15+
return "[]";
16+
}
17+
StringBuilder sb = new StringBuilder("[");
18+
Queue<TreeNode> queue = new LinkedList<>();
19+
queue.offer(root);
20+
while (!queue.isEmpty()) {
21+
TreeNode node = queue.poll();
22+
if (node != null) {
23+
sb.append(node.val);
24+
queue.offer(node.left);
25+
queue.offer(node.right);
26+
} else {
27+
sb.append("null");
28+
}
29+
sb.append(",");
30+
}
31+
return sb.deleteCharAt(sb.length() - 1).append("]").toString();
32+
}
33+
34+
// Decodes your encoded data to tree.
35+
public TreeNode deserialize(String data) {
36+
if (data == null || "[]".equals(data)) {
37+
return null;
38+
}
39+
String[] nodes = data.substring(1, data.length() - 1).split(",");
40+
Queue<TreeNode> queue = new LinkedList<>();
41+
TreeNode root = new TreeNode(Integer.parseInt(nodes[0]));
42+
queue.offer(root);
43+
int idx = 1;
44+
while (!queue.isEmpty() && idx < nodes.length) {
45+
TreeNode node = queue.poll();
46+
if (!"null".equals(nodes[idx])) {
47+
node.left = new TreeNode(Integer.parseInt(nodes[idx]));
48+
queue.offer(node.left);
49+
}
50+
++idx;
51+
if (!"null".equals(nodes[idx])) {
52+
node.right = new TreeNode(Integer.parseInt(nodes[idx]));
53+
queue.offer(node.right);
54+
}
55+
++idx;
56+
}
57+
return root;
58+
}
59+
}
60+
61+
// Your Codec object will be instantiated and called as such:
62+
// Codec codec = new Codec();
63+
// codec.deserialize(codec.serialize(root));
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Codec:
9+
10+
def serialize(self, root):
11+
"""Encodes a tree to a single string.
12+
13+
:type root: TreeNode
14+
:rtype: str
15+
"""
16+
if not root:
17+
return '[]'
18+
queue = collections.deque()
19+
queue.append(root)
20+
res = []
21+
while queue:
22+
node = queue.popleft()
23+
if node:
24+
res.append(str(node.val))
25+
queue.append(node.left)
26+
queue.append(node.right)
27+
else:
28+
res.append('null')
29+
return f'[{",".join(res)}]'
30+
31+
32+
def deserialize(self, data):
33+
"""Decodes your encoded data to tree.
34+
35+
:type data: str
36+
:rtype: TreeNode
37+
"""
38+
if not data or data == '[]':
39+
return None
40+
queue = collections.deque()
41+
nodes = data[1:-1].split(',')
42+
root = TreeNode(nodes[0])
43+
queue.append(root)
44+
idx = 1
45+
while queue and idx < len(nodes):
46+
node = queue.popleft()
47+
if nodes[idx] != 'null':
48+
node.left = TreeNode(nodes[idx])
49+
queue.append(node.left)
50+
idx += 1
51+
if nodes[idx] != 'null':
52+
node.right = TreeNode(nodes[idx])
53+
queue.append(node.right)
54+
idx += 1
55+
return root
56+
57+
58+
# Your Codec object will be instantiated and called as such:
59+
# codec = Codec()
60+
# codec.deserialize(codec.serialize(root))

0 commit comments

Comments
 (0)