From e10eaa99f819e9e73087941e4fcef177f0995843 Mon Sep 17 00:00:00 2001 From: saenaii Date: Sat, 27 Mar 2021 19:30:25 +0800 Subject: [PATCH] added leetcode 297 --- .gitignore | 1 + ...7.Serialize and Deserialize Binary Tree.go | 58 +++++++++++++++++++ ...ialize and Deserialize Binary Tree_test.go | 55 ++++++++++++++++++ .../README.md | 51 ++++++++++++++++ 4 files changed, 165 insertions(+) create mode 100644 leetcode/0297.Serialize-and-Deserialize-Binary-Tree/297.Serialize and Deserialize Binary Tree.go create mode 100644 leetcode/0297.Serialize-and-Deserialize-Binary-Tree/297.Serialize and Deserialize Binary Tree_test.go create mode 100644 leetcode/0297.Serialize-and-Deserialize-Binary-Tree/README.md diff --git a/.gitignore b/.gitignore index 405ec2c3a..e1e2e99aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.toml +.idea diff --git a/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/297.Serialize and Deserialize Binary Tree.go b/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/297.Serialize and Deserialize Binary Tree.go new file mode 100644 index 000000000..8685e09c9 --- /dev/null +++ b/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/297.Serialize and Deserialize Binary Tree.go @@ -0,0 +1,58 @@ +package leetcode + +import ( + "strconv" + "strings" + + "github.com/halfrost/LeetCode-Go/structures" +) + +type TreeNode = structures.TreeNode + +type Codec struct { + builder strings.Builder + input []string +} + +func Constructor() Codec { + return Codec{} +} + +// Serializes a tree to a single string. +func (this *Codec) serialize(root *TreeNode) string { + if root == nil { + this.builder.WriteString("#,") + return "" + } + + this.builder.WriteString(strconv.Itoa(root.Val)+",") + this.serialize(root.Left) + this.serialize(root.Right) + + return this.builder.String() +} + +// Deserializes your encoded data to tree. +func (this *Codec) deserialize(data string) *TreeNode { + if len(data) == 0 { + return nil + } + this.input = strings.Split(data, ",") + return this.deserializeHelper() +} + +func (this *Codec) deserializeHelper() *TreeNode { + if this.input[0] == "#" { + this.input = this.input[1:] + return nil + } + + val, _ := strconv.Atoi(this.input[0]) + this.input = this.input[1:] + + return &TreeNode{ + Val: val, + Left: this.deserializeHelper(), + Right: this.deserializeHelper(), + } +} \ No newline at end of file diff --git a/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/297.Serialize and Deserialize Binary Tree_test.go b/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/297.Serialize and Deserialize Binary Tree_test.go new file mode 100644 index 000000000..6069704e2 --- /dev/null +++ b/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/297.Serialize and Deserialize Binary Tree_test.go @@ -0,0 +1,55 @@ +package leetcode + +import ( + "fmt" + "testing" + + "github.com/halfrost/LeetCode-Go/structures" +) + +type question297 struct { + para297 + ans297 +} + +// para 是参数 +// one 代表第一个参数 +type para297 struct { + one []int +} + +// ans 是答案 +// one 代表第一个答案 +type ans297 struct { + one []int +} + +func Test_Problem297(t *testing.T) { + qs := []question297{ + { + para297{[]int{}}, + ans297{[]int{}}, + }, + { + para297{[]int{1,2,3,-1,-1,4,5}}, + ans297{[]int{1,2,3,-1,-1,4,5}}, + }, + { + para297{[]int{1,2}}, + ans297{[]int{1,2}}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 297------------------------\n") + + for _, q := range qs { + _, p := q.ans297, q.para297 + fmt.Printf("【input】:%v ", p) + root := structures.Ints2TreeNode(p.one) + + tree297 := Constructor() + serialized := tree297.serialize(root) + fmt.Printf("【output】:%v \n", structures.Tree2Preorder(tree297.deserialize(serialized))) + } + fmt.Printf("\n\n\n") +} \ No newline at end of file diff --git a/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/README.md b/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/README.md new file mode 100644 index 000000000..bc9ab58bf --- /dev/null +++ b/leetcode/0297.Serialize-and-Deserialize-Binary-Tree/README.md @@ -0,0 +1,51 @@ +# [297. Serialize and Deserialize Binary Tree](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/) + +## 题目 + +Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment. + +Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure. + +**Clarification:** The input/output format is the same as how LeetCode serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself. + +Example 1: + +``` +Input: root = [1,2,3,null,null,4,5] +Output: [1,2,3,null,null,4,5] +``` + +Example 2: + +``` +Input: root = [] +Output: [] +``` + +Example 3: + +``` +Input: root = [1] +Output: [1] +``` + +Example 4: + +``` +Input: root = [1,2] +Output: [1,2] +``` + +Constraints: + +* The number of nodes in the tree is in the range [0, 104]. +* -1000 <= Node.val <= 1000 + +## 题目大意 + +设计一个算法,来序列化和反序列化二叉树。并不限制如何进行序列化和反序列化,但是你需要保证二叉树可以序列化为字符串,并且这个字符串可以被反序列化成原有的二叉树。 + +## 解题思路 + +1. 将给定的二叉树想象成一颗满二叉树(不存在的结点用 null 填充)。 +2. 通过前序遍历,可以得到一个第一个结点为根的序列,然后递归进行序列化/反序列化即可。