golang 递归遍历树节点

本文探讨了在数据结构中树的重要性,特别是针对行政区划数据的处理。通过递归函数,介绍如何在Golang中有效地遍历和操作树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在数据结构的组织中重要的一节一定会包含”树”,和相应的处理”树”的递归函数。这一节,就是说明如何的处理工作当中的很重要的数据展现,行政区划的处理。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值