Problem 3 and remove main.go
This commit is contained in:
parent
83d8df7520
commit
bb4c55a387
7
main.go
7
main.go
@ -1,7 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import "log"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
log.Println(problem2([]int{3, 2, 1}))
|
|
||||||
}
|
|
||||||
80
problem3.go
Normal file
80
problem3.go
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
//Given the root to a binary tree, implement serialize(root), which serializes the tree into a string, and deserialize(s), which deserializes the string back into the tree.
|
||||||
|
//
|
||||||
|
//For example, given the following Node class
|
||||||
|
//
|
||||||
|
//class Node:
|
||||||
|
// def __init__(self, val, left=None, right=None):
|
||||||
|
// self.val = val
|
||||||
|
// self.left = left
|
||||||
|
// self.right = right
|
||||||
|
//The following test should pass:
|
||||||
|
//
|
||||||
|
//node = Node('root', Node('left', Node('left.left')), Node('right'))
|
||||||
|
//assert deserialize(serialize(node)).left.left.val == 'left.left'
|
||||||
|
|
||||||
|
type Node struct {
|
||||||
|
Val string
|
||||||
|
Left *Node
|
||||||
|
Right *Node
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *Node) Serialize() string {
|
||||||
|
if *n == (Node{}) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return n.Val + "\u200b" + n.Left.Serialize() + "\u200b" + n.Right.Serialize() + "\u200b"
|
||||||
|
}
|
||||||
|
|
||||||
|
func Deserialize(s string) *Node {
|
||||||
|
sc := make(chan string)
|
||||||
|
go func() {
|
||||||
|
for _, val := range strings.Split(s, "\u200b") {
|
||||||
|
sc <- val
|
||||||
|
}
|
||||||
|
close(sc)
|
||||||
|
}()
|
||||||
|
return processNode(sc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func processNode(sc <-chan string) *Node {
|
||||||
|
root := Node{}
|
||||||
|
for val := range sc {
|
||||||
|
if val == "" {
|
||||||
|
return &root
|
||||||
|
}
|
||||||
|
root.Val = val
|
||||||
|
root.Left = processNode(sc)
|
||||||
|
root.Right = processNode(sc)
|
||||||
|
}
|
||||||
|
return &root
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
n := &Node{
|
||||||
|
Val: "root",
|
||||||
|
Left: &Node{
|
||||||
|
Val: "left",
|
||||||
|
Left: &Node{
|
||||||
|
Val: "left.left",
|
||||||
|
Left: &Node{},
|
||||||
|
Right: &Node{},
|
||||||
|
},
|
||||||
|
Right: &Node{},
|
||||||
|
},
|
||||||
|
Right: &Node{
|
||||||
|
Val: "right",
|
||||||
|
Left: &Node{},
|
||||||
|
Right: &Node{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
s := n.Serialize()
|
||||||
|
log.Println(s)
|
||||||
|
log.Println(Deserialize(s).Left.Left.Val)
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user