Skip to content

Commit fc13aab

Browse files
author
Dinghao LI
committed
062
1 parent b84d242 commit fc13aab

File tree

6 files changed

+178
-5
lines changed

6 files changed

+178
-5
lines changed

059-对称的二叉树/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@
1010

1111
二叉树是否对称的本质,其实是判定两棵树是否镜像
1212

13-
即响应对的位置的节点是否对应相等
13+
即响应对的位置的节点是否对应相等t
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# 题目描述
2+
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
3+
4+
# 思路
5+
按层次输出二叉树
6+
7+
访问根节点,并将根节点入队。
8+
9+
当队列不空的时候,重复以下操作。
10+
11+
弹出一个元素。作为当前的根节点。
12+
如果根节点有左孩子,访问左孩子,并将左孩子入队。
13+
如果根节点有右孩子,访问右孩子,并将右孩子入队。
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
type TreeNode struct {
8+
Val int
9+
Left *TreeNode
10+
Right *TreeNode
11+
}
12+
13+
func print(root *TreeNode) {
14+
var q1 []*TreeNode
15+
q1 = append(q1, root)
16+
for len(q1) != 0 {
17+
for len(q1) != 0 {
18+
node := q1[0]
19+
q1 = q1[1:len(q1)]
20+
fmt.Printf("%d ", node.Val)
21+
if node.Left != nil {
22+
q1 = append(q1, node.Left)
23+
}
24+
if node.Right != nil {
25+
q1 = append(q1, node.Right)
26+
}
27+
}
28+
}
29+
}
30+
31+
func main() {
32+
// q1 1
33+
// q2 2 3
34+
// q1 4 5 6 7
35+
root := &TreeNode{1, &TreeNode{2, &TreeNode{4, nil, nil}, &TreeNode{5, nil, nil}}, &TreeNode{3, &TreeNode{6, nil, nil}, &TreeNode{7, nil, nil}}}
36+
print(root)
37+
fmt.Printf("\n")
38+
39+
root.Right.Left.Left = &TreeNode{8, nil, nil}
40+
root.Right.Left.Right = &TreeNode{9, nil, nil}
41+
root.Right.Right.Left = &TreeNode{10, nil, nil}
42+
root.Right.Right.Right = &TreeNode{11, nil, nil}
43+
print(root)
44+
fmt.Printf("\n")
45+
}
Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
1-
# 题意
1+
# 题目描述
22

3-
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
3+
请实现两个函数,分别用来序列化和反序列化二叉树。这里没有规定序列化的方式
44

5-
# 层次遍历后结果之按字输出
6-
其实我们可以借鉴层次遍历时候的思路, 参见剑指Offer--060-把二叉树打印成多行, 我们把层次遍历的结果保存在vector< vector >中每一层保存在一个vector中, 那么我们输出的时候就可以进行调整, 按照之字形输出即可
5+
# 分析
6+
7+
## 遍历二叉树
8+
9+
其实这道题约定的序列化没有固定的格式, 只要你序列化后的结果, 再反序列化后与原树相同即可,
10+
11+
因此我们可以随意指定自己的格式,
12+
13+
比如空节点用$表示,或则#表示,
14+
15+
然后遍历采用先序, 中序, 后序或者层次都可以,
16+
17+
我们的示例程序中采用空结点用#表示, 结点与结点用逗号,分隔
18+
19+
选择了合适的遍历算法, 那么剩下的问题就是字符串序列和整数权值的相互转换问题
20+
序列化的关键, 其实就是将树的权值(整数)转换为字符串序列, 可以采用ostringstream, sprintf和itoa
21+
22+
反序列化的关键, 则正好相反, 将字符串转换为整数, 可以使用istringstream, sscanf和atoi

062-序列化二叉树/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# 题意
2+
3+
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
4+
5+
# 层次遍历后结果之按字输出
6+
7+
其实我们可以借鉴层次遍历时候的思路, 参见剑指Offer--060-把二叉树打印成多行, 我们把层次遍历的结果保存在vector< vector >中每一层保存在一个vector中, 那么我们输出的时候就可以进行调整, 按照之字形输出即可
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
)
7+
8+
type TreeNode struct {
9+
Val int
10+
Left *TreeNode
11+
Right *TreeNode
12+
}
13+
14+
func Serialize(root *TreeNode) string {
15+
if root == nil {
16+
return "#,"
17+
}
18+
str := ""
19+
str = SerializeTree(root, str)
20+
return str
21+
}
22+
23+
func SerializeTree(root *TreeNode, str string) string {
24+
if root == nil {
25+
str += "#,"
26+
return str
27+
}
28+
29+
str += strconv.Itoa(root.Val) + ","
30+
str += SerializeTree(root.Left, "")
31+
str += SerializeTree(root.Right, "")
32+
return str
33+
}
34+
35+
func Deserialize(str string) *TreeNode {
36+
if str == "" {
37+
return nil
38+
}
39+
return DeserializeTree(str)
40+
}
41+
42+
func DeserializeTree(str string) *TreeNode {
43+
index := 0
44+
var recur func(str string) *TreeNode
45+
recur = func(str string) *TreeNode {
46+
if str[index] == '#' {
47+
index += 2
48+
return nil
49+
}
50+
num := 0
51+
for str[index] != ',' && index < len(str) {
52+
num = num*10 + int(str[index] - '0')
53+
index++
54+
}
55+
index++
56+
57+
root := &TreeNode{num, nil, nil}
58+
root.Left = recur(str)
59+
root.Right = recur(str)
60+
return root
61+
}
62+
root := recur(str)
63+
return root
64+
65+
}
66+
67+
func print(root *TreeNode) {
68+
if root == nil {
69+
return
70+
}
71+
fmt.Printf("%d -> ", root.Val)
72+
print(root.Left)
73+
print(root.Right)
74+
}
75+
76+
func main() {
77+
// q1 1
78+
// q2 2 3
79+
// q1 4 5 6 7
80+
root := &TreeNode{1, &TreeNode{2, &TreeNode{4, nil, nil}, &TreeNode{5, nil, nil}}, &TreeNode{3, &TreeNode{6, nil, nil}, &TreeNode{7, nil, nil}}}
81+
82+
fmt.Println("Output: ", Serialize(root))
83+
fmt.Println("")
84+
fmt.Println("before")
85+
print(root)
86+
fmt.Println("")
87+
root = Deserialize(Serialize(root))
88+
fmt.Println("after")
89+
print(root)
90+
fmt.Println("")
91+
92+
}

0 commit comments

Comments
 (0)