노드값과 노드간의 관계는 TreeDesc를 사용하여 기술하고, 이를 buildTree에 넘겨 이진 트리를 생성한다. TreeDesc를 기술할 때, 루트 노드가 반드시 첫번째에 위치하지 않아도 상관 없다 (Go의 map 특성상 iteration의 순서가 보장되지도 않는다).
======================================================
type NodeVal int
type Node struct {
Val NodeVal
Left *Node
Right *Node
}
type TreeDesc map[NodeVal]struct{Left, Right NodeVal}
func main() {
tree := TreeDesc{
1: {2, 3},
2: {4, 5},
3: {-1, -1},
4: {-1, -1},
5: {-1, -1},
}
root := buildTree(tree)
// use root
}
func buildTree(tree TreeDesc) *Node {
visited := map[NodeVal]*Node{}
topology := []NodeVal{}
for key, _ := range tree {
createNode(key, tree, visited, &topology)
}
return visited[topology[len(topology) - 1]]
}
func createNode(key NodeVal, tree TreeDesc, visited map[NodeVal]*Node, topology *[]NodeVal) *Node {
if key == -1 {
return nil
}
if visited[key] != nil {
return visited[key]
}
newNode := &Node{
Val: key,
}
visited[key] = newNode
newNode.Left = createNode(tree[key].Left, tree, visited, topology)
newNode.Right = createNode(tree[key].Right, tree, visited, topology)
*topology = append(*topology, key)
return newNode
}
댓글 없음:
댓글 쓰기