Tree 用golang从桌子上做一棵树?
我想用桌子做一棵树。 下表如下:Tree 用golang从桌子上做一棵树?,tree,go,treenode,Tree,Go,Treenode,我想用桌子做一棵树。 下表如下: OrgID OrgName parentID A001 Dept 0 -----th top A002 subDept1 A001 A003 sub_subDept A002 A006 gran_subDept A003 A004 subDept2 A001 我想得到的结果如下,如何使用go实现: Dept --subDept1 ----sub_su
OrgID OrgName parentID
A001 Dept 0 -----th top
A002 subDept1 A001
A003 sub_subDept A002
A006 gran_subDept A003
A004 subDept2 A001
我想得到的结果如下,如何使用go实现:
Dept
--subDept1
----sub_subDept
------gran_subDept
--subDept2
部
--子部门1
----分部
------格兰乌分部
--亚部2
根据问题和评论中提供的信息,可以解决问题的是一个普通的递归循环
package main
import "fmt"
type Org struct {
OrgID string
OrgName string
parentID string
}
func printTree(tbl []Org, parent string, depth int) {
for _, r := range tbl {
if r.parentID == parent {
for i := 0; i < depth; i++ {
fmt.Print("--")
}
fmt.Print(r.OrgName, "\n\n")
printTree(tbl, r.OrgID, depth+1)
}
}
}
func main() {
data := []Org{
{"A001", "Dept", "0 -----th top"},
{"A002", "subDept1", "A001"},
{"A003", "sub_subDept", "A002"},
{"A006", "gran_subDept", "A003"},
{"A004", "subDept2", "A001"},
}
printTree(data, "0 -----th top", 0)
}
操场:
请注意,如果父函数是其子函数的后代,则此递归函数可能会陷入循环中。如果要将行解析为树结构,可以这样做:
package main
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
type Node struct {
name string
children []*Node
}
var (
nodeTable = map[string]*Node{}
root *Node
)
func add(id, name, parentId string) {
fmt.Printf("add: id=%v name=%v parentId=%v\n", id, name, parentId)
node := &Node{name: name, children: []*Node{}}
if parentId == "0" {
root = node
} else {
parent, ok := nodeTable[parentId]
if !ok {
fmt.Printf("add: parentId=%v: not found\n", parentId)
return
}
parent.children = append(parent.children, node)
}
nodeTable[id] = node
}
func scan() {
input := os.Stdin
reader := bufio.NewReader(input)
lineCount := 0
for {
lineCount++
line, err := reader.ReadString('\n')
if err == io.EOF {
break
}
if err != nil {
fmt.Printf("error reading lines: %v\n", err)
return
}
tokens := strings.Fields(line)
if t := len(tokens); t != 3 {
fmt.Printf("bad input line %v: tokens=%d [%v]\n", lineCount, t, line)
continue
}
add(tokens[0], tokens[1], tokens[2])
}
}
func showNode(node *Node, prefix string) {
if prefix == "" {
fmt.Printf("%v\n\n", node.name)
} else {
fmt.Printf("%v %v\n\n", prefix, node.name)
}
for _, n := range node.children {
showNode(n, prefix+"--")
}
}
func show() {
if root == nil {
fmt.Printf("show: root node not found\n")
return
}
fmt.Printf("RESULT:\n")
showNode(root, "")
}
func main() {
fmt.Printf("main: reading input from stdin\n")
scan()
fmt.Printf("main: reading input from stdin -- done\n")
show()
fmt.Printf("main: end\n")
}
具体是什么样的表;mysql表?[]组织切片?mongoDB系列?您希望树是什么类型的?该表是mysql中的一个片段。如果您希望得到json结果,您应该在问题中添加所需的json结构。您可以用多种方式表示该输出。
package main
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
type Node struct {
name string
children []*Node
}
var (
nodeTable = map[string]*Node{}
root *Node
)
func add(id, name, parentId string) {
fmt.Printf("add: id=%v name=%v parentId=%v\n", id, name, parentId)
node := &Node{name: name, children: []*Node{}}
if parentId == "0" {
root = node
} else {
parent, ok := nodeTable[parentId]
if !ok {
fmt.Printf("add: parentId=%v: not found\n", parentId)
return
}
parent.children = append(parent.children, node)
}
nodeTable[id] = node
}
func scan() {
input := os.Stdin
reader := bufio.NewReader(input)
lineCount := 0
for {
lineCount++
line, err := reader.ReadString('\n')
if err == io.EOF {
break
}
if err != nil {
fmt.Printf("error reading lines: %v\n", err)
return
}
tokens := strings.Fields(line)
if t := len(tokens); t != 3 {
fmt.Printf("bad input line %v: tokens=%d [%v]\n", lineCount, t, line)
continue
}
add(tokens[0], tokens[1], tokens[2])
}
}
func showNode(node *Node, prefix string) {
if prefix == "" {
fmt.Printf("%v\n\n", node.name)
} else {
fmt.Printf("%v %v\n\n", prefix, node.name)
}
for _, n := range node.children {
showNode(n, prefix+"--")
}
}
func show() {
if root == nil {
fmt.Printf("show: root node not found\n")
return
}
fmt.Printf("RESULT:\n")
showNode(root, "")
}
func main() {
fmt.Printf("main: reading input from stdin\n")
scan()
fmt.Printf("main: reading input from stdin -- done\n")
show()
fmt.Printf("main: end\n")
}