在数据结构的组织中重要的一节一定会包含”树”,和相应的处理”树”的递归函数。这一节,就是说明如何的处理工作当中的很重要的数据展现,行政区划的处理。
[ { "code":1, "p_code":0, "name":"c1" }, { "code":4, "p_code":1, "name":"c4" }, { "code":2, "p_code":1, "name":"c2" }, { "code":5, "p_code":3, "name":"c5" }, { "code":3, "p_code":1, "name":"c3" }, { "code":6, "p_code":3, "name":"c6" }, { "code":7, "p_code":4, "name":"c7" }, { "code":8, "p_code":2, "name":"c8" }, { "code":9, "p_code":2, "name":"c9" }, { "code":10, "p_code":9, "name":"c10" }, { "code":11, "p_code":9, "name":"c11" }, { "code":12, "p_code":5, "name":"c12" } ]
附示例代码
package main
import (
"encoding/json"
"fmt"
"time"
)
/*数据结构*/
type CodeList struct {
Code int
P_Code int
Name string
}
type Ret struct {
Code int
P_Code int
Name string
Child []CodeList
}
/*const CHOOSENODE = 4*/
var ChooseNode = 4
func main() {
cond := make([]CodeList,0)
err := json.Unmarshal([]byte(str),&cond)
exitOnError(err)
ret := make([]CodeList,0)
/*选择需要开始遍历的节点*/
//tmp := CodeList{}
//tmp.Code = ChooseNode
//tmp.Code = ""
//find(v,cond,&ret)
for _,v := range cond {
/*选择需要开始遍历的节点*/
if v.Code == ChooseNode{
find(v,cond,&ret)
break
}
}
}
/*
查询指定节点的子节点
*/
func findChile(currentCode CodeList,cond []CodeList)(child []CodeList) {
for _, v := range cond {
if currentCode.Code == v.P_Code{
child = append(child,v)
}
}
return
}
/*递归函数*/
func find(currentCode CodeList,cond []CodeList,Ret *[]CodeList) {
//
tmp := findChile(currentCode,cond)
fmt.Println("child",tmp)
time.Sleep(1*time.Second)
if len(tmp) == 0{
return
}
for _, v := range tmp {
for _, vv := range cond {
if v.P_Code == vv.Code {
*Ret = append(*Ret,v)
}
}
find(v,cond,Ret)
}
}
/*错误处理函数*/
func exitOnError(err error){
if err != nil{
panic(err)
}
}