|
1 | 1 | # ---
|
2 | 2 | # title: 297. Serialize and Deserialize Binary Tree
|
3 | 3 | # id: problem297
|
4 |
| -# author: Tian Jun |
5 |
| -# date: 2020-10-31 |
| 4 | +# author: zhwang |
| 5 | +# date: 2022-03-11 |
6 | 6 | # difficulty: Hard
|
7 | 7 | # categories: Tree, Design
|
8 | 8 | # link: <https://leetcode.com/problems/serialize-and-deserialize-binary-tree/description/>
|
|
71 | 71 | ## @lc code=start
|
72 | 72 | using LeetCode
|
73 | 73 |
|
74 |
| -## add your code here: |
| 74 | +serialize(::Nothing) = "[]" |
| 75 | +function serialize(root::TreeNode{Int})::String |
| 76 | + res, queue, hasnew = String[], Union{TreeNode,Nothing}[root], true |
| 77 | + while hasnew |
| 78 | + hasnew = false |
| 79 | + for _ in 1:length(queue) |
| 80 | + node = popfirst!(queue) |
| 81 | + if !isnothing(node) |
| 82 | + push!(res, string(node.val)) |
| 83 | + push!(queue, node.left) |
| 84 | + push!(queue, node.right) |
| 85 | + all(isnothing.([node.left, node.right])) || (hasnew = true) |
| 86 | + else |
| 87 | + push!(res, "null") |
| 88 | + end |
| 89 | + end |
| 90 | + end |
| 91 | + return "[" * join(res, ',') * "]" |
| 92 | +end |
| 93 | + |
| 94 | +function deserialize(data::String)::Union{TreeNode,Nothing} |
| 95 | + data == "[]" && return nothing |
| 96 | + vals = split(data[2:(end - 1)], ',') |
| 97 | + root, n = TreeNode(parse(Int, vals[1])), length(vals) |
| 98 | + queue, m = [root], 2 |
| 99 | + while m <= n |
| 100 | + for _ in 1:length(queue) # new nodes |
| 101 | + node = popfirst!(queue) |
| 102 | + if vals[m] != "null" |
| 103 | + node.left = TreeNode(parse(Int, vals[m])) |
| 104 | + push!(queue, node.left) |
| 105 | + end |
| 106 | + if vals[m + 1] != "null" |
| 107 | + node.right = TreeNode(parse(Int, vals[m + 1])) |
| 108 | + push!(queue, node.right) |
| 109 | + end |
| 110 | + m += 2 |
| 111 | + end |
| 112 | + end |
| 113 | + return root |
| 114 | +end |
| 115 | + |
75 | 116 | ## @lc code=end
|
0 commit comments