在数据结构的组织中重要的一节一定会包含”树”,和相应的处理”树”的递归函数。这一节,就是说明如何的处理工作当中的很重要的数据展现,行政区划的处理。
var str =
[
{
"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)
}
}
树和递归资源
https://www.ibm.com/developerworks/cn/linux/l-recurs.html