golang通過(guò)遞歸遍歷生成樹(shù)狀結(jié)構(gòu)的操作
業(yè)務(wù)場(chǎng)景:
一個(gè)機(jī)構(gòu)查詢科室信息的時(shí)候,希望返回樹(shù)狀結(jié)構(gòu)的嵌套格式;
解決辦法:
通過(guò)遞歸和指針,嵌套成對(duì)應(yīng)的結(jié)構(gòu)體;
借鑒了前人的代碼,但是最后遞歸的指針調(diào)用自己也是調(diào)試了半天才出來(lái),這里獻(xiàn)上完整的示例代碼.
package main
import (
"fmt"
"encoding/json"
)
type dept struct {
DeptId string `json:"deptId"`
FrameDeptStr string `json:"frameDeptStr"`
Child []*dept `json:"child"`
}
func main() {
depts := make([]dept,0)
var a dept
a.DeptId = "1"
a.FrameDeptStr = ""
depts = append(depts,a)
a.DeptId="3"
a.FrameDeptStr = "1"
depts = append(depts,a)
a.DeptId="4"
a.FrameDeptStr = "1"
depts = append(depts,a)
a.DeptId="5"
a.FrameDeptStr = "13"
depts = append(depts,a)
a.DeptId="6"
a.FrameDeptStr = "13"
depts = append(depts,a)
fmt.Println(depts)
deptRoots := make([]dept,0)
for _,v := range depts{
if v.FrameDeptStr == ""{
deptRoots= append(deptRoots,v)
}
}
pdepts := make([]*dept,0)
for i,_ := range depts{
var a *dept
a = &depts[i]
pdepts = append(pdepts,a)
}
//獲取了根上的科室
fmt.Println("根上的科室有:",deptRoots)
var node *dept
node = &depts[0]
makeTree(pdepts,node)
fmt.Println("the result we got is",pdepts)
data, _ := json.Marshal(node)
fmt.Printf("%s", data)
}
func has(v1 dept,vs []*dept) bool {
var has bool
has = false
for _,v2 := range vs {
v3 := *v2
if v1.FrameDeptStr+v1.DeptId == v3.FrameDeptStr{
has = true
break
}
}
return has
}
func makeTree(vs []*dept,node *dept) {
fmt.Println("the node value in maketree is:",*node)
childs := findChild(node,vs)
fmt.Println(" the child we got is :",childs)
for _,child := range childs{
fmt.Println("in the childs's for loop, the child's address here is:",&child)
node.Child = append(node.Child,child)
fmt.Println("in the child's for loop, after append the child is:",child)
if has(*child,vs) {
fmt.Println("i am in if has")
fmt.Println("the child in if has is:",*child)
fmt.Println("the child in if has 's address is:",child)
makeTree(vs,child)
}
}
}
func findChild(v *dept,vs []*dept)(ret []*dept) {
for _,v2 := range vs{
if v.FrameDeptStr+v.DeptId == v2.FrameDeptStr{
ret= append(ret,v2)
}
}
return
}
代碼備注:
通過(guò)frame_dept_str來(lái)確定科室之間的關(guān)系的, (a.frame_dept_str= a's parent's frame_dept_str + a's parent's dept_id).
補(bǔ)充:golang的樹(shù)結(jié)構(gòu)三種遍歷方式
看代碼吧~
package main
import "log"
type node struct {
Item string
Left *node
Right *node
}
type bst struct {
root *node
}
/*
m
k l
h i j
a b c d e f
//先序遍歷(根左右):m k h a b i c d l j e f
//中序遍歷(左根右):a h b k c i d m l e j f
//后序遍歷(左右根):a b h c d i k e f j l m
*/
func (tree *bst) buildTree() {
m := &node{Item: "m"}
tree.root = m
k := &node{Item: "k"}
l := &node{Item: "l"}
m.Left = k
m.Right = l
h := &node{Item: "h"}
i := &node{Item: "i"}
k.Left = h
k.Right = i
a := &node{Item: "a"}
b := &node{Item: "b"}
h.Left = a
h.Right = b
c := &node{Item: "c"}
d := &node{Item: "d"}
i.Left = c
i.Right = d
j := &node{Item: "j"}
l.Right = j
e := &node{Item: "e"}
f := &node{Item: "f"}
j.Left = e
j.Right = f
}
//先序遍歷
func (tree *bst) inOrder() {
var inner func(n *node)
inner = func(n *node) {
if n == nil {
return
}
log.Println(n.Item)
inner(n.Left)
inner(n.Right)
}
inner(tree.root)
}
//中序
func (tree *bst) midOrder() {
var inner func(n *node)
inner = func(n *node) {
if n == nil {
return
}
inner(n.Left)
log.Println(n.Item)
inner(n.Right)
}
inner(tree.root)
}
//后序
func (tree *bst) lastOrder() {
var inner func(n *node)
inner = func(n *node) {
if n == nil {
return
}
inner(n.Left)
inner(n.Right)
log.Println(n.Item)
}
inner(tree.root)
}
func main() {
tree := &bst{}
tree.buildTree()
// tree.inOrder()
tree.lastOrder()
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
在Mac中搭建go語(yǔ)言開(kāi)發(fā)環(huán)境的操作步驟
go語(yǔ)言在開(kāi)發(fā)效率和運(yùn)行效率中的優(yōu)勢(shì)讓很多人青睞,所以有傾向打算轉(zhuǎn)向go語(yǔ)言的開(kāi)發(fā)。下面介紹在Mac中g(shù)olang的開(kāi)發(fā)環(huán)境配置。有需要的可以參考借鑒。2016-08-08
Go語(yǔ)言實(shí)現(xiàn)Sm2加解密的示例代碼
本文主要介紹了Go語(yǔ)言實(shí)現(xiàn)Sm2加解密的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
grpc-go如何通過(guò)context傳遞額外數(shù)據(jù)
metadata是grpc內(nèi)置的,用RPC服務(wù)傳遞http頭數(shù)據(jù),分in和out兩種,對(duì)應(yīng)的key都為一個(gè)空struct,這篇文章主要介紹了grpc-go通過(guò)context傳遞額外數(shù)據(jù),需要的朋友可以參考下2024-02-02
Golang?Compare?And?Swap算法詳細(xì)介紹
CAS算法是一種有名的無(wú)鎖算法。無(wú)鎖編程,即不使用鎖的情況下實(shí)現(xiàn)多線程之間的變量同步,也就是在沒(méi)有線程被阻塞的情況下實(shí)現(xiàn)變量的同步,所以也叫非阻塞同步Non-blocking?Synchronization2022-10-10
使用golang進(jìn)行http,get或postJson請(qǐng)求
這篇文章主要為大家詳細(xì)介紹了如何使用golang進(jìn)行http,get或postJson請(qǐng)求,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-12-12
一文帶你掌握Go語(yǔ)言并發(fā)模式中的Context的上下文管理
在?Go?的日常開(kāi)發(fā)中,Context?上下文對(duì)象無(wú)處不在,無(wú)論是處理網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫(kù)操作還是調(diào)用?RPC?等場(chǎng)景,那你真的熟悉它的正確用法嗎,隨著本文一探究竟吧2023-05-05

