func serialByPre(head *Node) string {
// base case
if head == nil {
return "#_"
}
str := strconv.Itoa(head.value) + "_"
str += serialByPre(head.left)
str += serialByPre(head.right)
return str
}
func reconPreOrder(queue *[]string) *Node {
cur := (*queue)[0]
*queue = (*queue)[1:]
// base case
if cur == "#" {
return nil
}
val, _ := strconv.Atoi(cur)
head := &Node{value: val}
head.left = reconPreOrder(queue)
head.right = reconPreOrder(queue)
return head
}
func reconByPreString(str string) *Node {
if len(str) == 0 {
return nil
}
chars := strings.Split(str, "_")
return reconPreOrder(&chars)
}
func serialByLevel(head *Node) string {
// base case
if head == nil {
return "#_"
}
queue := make([]*Node, 0, 32)
res := strconv.Itoa(head.value) + "_"
queue = append(queue, head)
for len(queue) != 0 {
head = queue[0]
queue = queue[1:]
if head.left != nil {
res += strconv.Itoa(head.left.value) + "_"
queue = append(queue, head.left)
} else {
res += "#_"
}
if head.right != nil {
res += strconv.Itoa(head.right.value) + "_"
queue = append(queue, head.right)
} else {
res += "#_"
}
}
return res
}
func generateNodeByString(val string) *Node {
if val == "#" {
return nil
}
value, _ := strconv.Atoi(val)
return &Node{value: value}
}
func reconByLevelString(levelStr string) *Node {
values := strings.Split(levelStr, "_")
index := 0
head := generateNodeByString(values[0])
index++
queue := make([]*Node, 0, 32)
if head != nil {
queue = append(queue, head)
}
var node *Node
for len(queue) != 0 {
node = queue[0]
queue = queue[1:]
node.left = generateNodeByString(values[index])
index++
node.right = generateNodeByString(values[index])
index++
if node.left != nil {
queue = append(queue, node.left)
}
if node.right != nil {
queue = append(queue, node.right)
}
}
return head
}
子树包含问题
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。