
本教程旨在详细阐述如何利用go语言,将包含父子关系的扁平化表格数据结构化为层次分明的树形结构。通过设计高效的节点数据模型、运用哈希映射实现父节点快速查找,以及采用递归算法进行树的构建与展示,本方案提供了一种通用且实用的方法,适用于处理组织架构、目录结构等多种场景下的层级数据。
在许多业务场景中,我们经常会遇到以扁平化表格形式存储的层级数据,例如公司的组织架构、文件系统的目录结构或产品分类。这类数据通常包含一个唯一标识符、一个名称以及一个指向其父级的标识符。为了更直观地理解和操作这些数据,将其转换为树形结构是常见的需求。本教程将详细介绍如何使用Go语言高效地实现这一转换过程。
要构建树形结构,首先需要定义表示树中节点的结构体,并辅以辅助数据结构来高效地管理和查找这些节点。
每个节点应包含其自身的名称以及一个指向其所有子节点的列表。
type Node struct {
name string
children []*Node
}为了在构建树时能够快速通过ID查找父节点,我们使用一个哈希表(Go中的map)来存储所有已创建的节点,其中键是节点的唯一ID,值是指向该节点的指针。
var nodeTable = map[string]*Node{}树结构通常有一个或多个根节点。在本教程的示例中,我们假设只有一个根节点,其 parentID 为 "0"。
var root *Node
add 函数负责根据给定的ID、名称和父节点ID来创建新节点并将其插入到正确的父节点下。
func add(id, name, parentId string) {
node := &Node{name: name, children: []*Node{}} // 创建新节点
if parentId == "0" { // 如果父ID为"0",则此节点是根节点
root = node
} else {
// 查找父节点
parent, ok := nodeTable[parentId]
if !ok {
fmt.Printf("错误:未找到父节点ID %v\n", parentId)
return
}
// 将新节点添加到父节点的子节点列表中
parent.children = append(parent.children, node)
}
// 将新节点添加到全局节点表中,以便后续查找
nodeTable[id] = node
}scan 函数负责从输入源(例如标准输入)读取数据,解析每一行,并调用 add 函数来构建树。
*CLabs
AI移除视频背景,100%自动和免费
337
查看详情
假设输入数据格式为:OrgID OrgName parentID,例如:
A001 Dept 0 A002 subDept1 A001 A003 sub_subDept A002 A006 gran_subDept A003 A004 subDept2 A001
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
func scan() {
reader := bufio.NewReader(os.Stdin) // 从标准输入读取
lineCount := 0
for {
lineCount++
line, err := reader.ReadString('\n') // 读取一行
if err == io.EOF { // 读取到文件末尾
break
}
if err != nil {
fmt.Printf("读取输入时发生错误: %v\n", err)
return
}
tokens := strings.Fields(line) // 按空格分割字符串
if len(tokens) != 3 { // 检查字段数量
fmt.Printf("第 %v 行输入格式错误,跳过: %v\n", lineCount, strings.TrimSpace(line))
continue
}
// 调用add函数构建树
add(tokens[0], tokens[1], tokens[2])
}
}构建完树后,我们需要一种方式来展示它。这里使用递归函数 showNode 来遍历树并打印出带有缩进的结构。
func showNode(node *Node, prefix string) {
if node == nil {
return
}
// 打印当前节点,并根据层级添加缩进
fmt.Printf("%s%s\n", prefix, node.name)
// 递归打印所有子节点
for _, n := range node.children {
showNode(n, prefix+"--") // 子节点的缩进增加
}
}
func show() {
if root == nil {
fmt.Printf("错误:根节点未找到,无法展示树结构。\n")
return
}
fmt.Printf("树形结构结果:\n")
showNode(root, "") // 从根节点开始展示,初始缩进为空
}将上述所有部分整合,构成一个完整的Go程序。
package main
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
// Node 结构体定义树中的一个节点
type Node struct {
name string
children []*Node
}
// nodeTable 用于通过ID快速查找节点
var nodeTable = map[string]*Node{}
// root 存储树的根节点
var root *Node
// add 函数用于创建新节点并将其添加到树中
func add(id, name, parentId string) {
node := &Node{name: name, children: []*Node{}}
if parentId == "0" {
root = node
} else {
parent, ok := nodeTable[parentId]
if !ok {
fmt.Printf("错误:未找到父节点ID %v,无法添加节点 %v (%v)\n", parentId, name, id)
return
}
parent.children = append(parent.children, node)
}
nodeTable[id] = node
}
// scan 函数从标准输入读取数据并构建树
func scan() {
reader := bufio.NewReader(os.Stdin)
lineCount := 0
for {
lineCount++
line, err := reader.ReadString('\n')
if err == io.EOF {
break
}
if err != nil {
fmt.Printf("读取输入时发生错误: %v\n", err)
return
}
tokens := strings.Fields(line)
if len(tokens) != 3 {
fmt.Printf("第 %v 行输入格式错误,期望3个字段,实际 %d 个: %v\n", lineCount, len(tokens), strings.TrimSpace(line))
continue
}
add(tokens[0], tokens[1], tokens[2])
}
}
// showNode 递归地展示树的结构,带有缩进
func showNode(node *Node, prefix string) {
if node == nil {
return
}
fmt.Printf("%s%s\n", prefix, node.name)
for _, n := range node.children {
showNode(n, prefix+"--")
}
}
// show 函数作为展示树的入口
func show() {
if root == nil {
fmt.Printf("错误:根节点未找到,无法展示树结构。\n")
return
}
fmt.Printf("树形结构结果:\n")
showNode(root, "")
}
func main() {
fmt.Println("请输入表格数据 (OrgID OrgName parentID),每行一个,输入完成后按 Ctrl+D 结束:")
scan()
fmt.Println("\n数据读取完毕。")
show()
fmt.Println("\n程序执行结束。")
}
如何运行:
A001 Dept 0 A002 subDept1 A001 A003 sub_subDept A002 A006 gran_subDept A003 A004 subDept2 A001
树形结构结果: Dept --subDept1 ----sub_subDept ------gran_subDept --subDept2
本教程展示了如何使用Go语言将扁平化的表格数据转换为层次化的树形结构。通过精心设计 Node 结构体、利用 map 进行高效的父节点查找,以及采用递归方法进行树的构建和展示,我们提供了一个清晰、高效且易于理解的解决方案。这种方法在处理组织架构、文件系统等需要层级表示的数据时非常实用,并为进一步的数据操作和可视化奠定了基础。通过对输入源和错误处理的适当调整,此方案可以轻松适应各种实际应用场景。
以上就是使用Go语言将扁平化表格数据高效转换为树形结构的详细内容,更多请关注其它相关文章!
# 扁平化
# 嘉定区推广营销策划内容
# 兖州网站建设推广
# 网络营销推广工资多少
# 重庆seo费用是多少
# 杭州德阳网站优化方案
# 英文网站优化电池设置
# 广州车陂网站推广公司
# 网页制作与网站建设价位
# 新建公司网站怎么推广
# seo规范范文
# 只有一个
# 并在
# 组织架构
# 遍历
# 未找到
# linux
# 数据结构
# 转换为
# 多个
# 递归
# rest api
# win
# macos
# ai
# csv
# mac
# app
# go语言
# windows
# go
# node
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突
学习通网页版课程打不开_课程无法访问时的解决方法
快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效
b站如何管理订阅_b站订阅标签分类管理
抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法
Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析
蜻蜓FM如何设置移动流量播放
被称为海蜈蚣的海洋动物是
追剧达人如何发弹幕
Eclipse开发J*a快速入门
J*aScript对象中深度嵌套URL键的查找与更新策略
QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务
《海底捞》点外卖方法
PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素
vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读
C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧
电脑开不了机怎么办 电脑无法开机的解决方法
如何用mysql实现客户反馈管理_mysql客户反馈数据库方法
J*aScript 数值去小数位处理:多种方法与实践
React应用中Commerce.js数据加载与状态管理最佳实践
Go反射进阶:访问内嵌结构体中的被遮蔽方法
教资成绩怎么查询
我的世界游戏平台入口 我的世界官方官网直达链接
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
苹果11如何更换iCloud账号_苹果11账号切换的具体步骤
word表格如何按某一列内容进行排序_Word表格按列排序方法
iSpring三分屏制作教程
小红书网页版在线直达 小红书网页版免费登录入口
J*aScript实现下拉菜单驱动的动态表格数据展示
PHP 4 函数中引用参数的默认值限制与解决方案
《知到》打卡课程方法
263企业邮箱如何设置邮件转发功能
Google Drive API 认证:服务账户与OAuth 2.0的选择与实践
折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点
Final Cut Pro视频加EQ教程
苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程
J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析
J*aScript调试技巧_性能分析与内存快照
悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置
2025SNH48年度青春盛典门票价格及购买方式
《三国:谋定天下》平民全阶段通用阵容
使用Python和NLTK从文本中高效提取名词的实用教程
iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法
解决jQuery多计算器输入字段冲突的教程
原子笔记app误删找回教程
视频号视频怎么免费保存到相册?保存到相册需要注意什么?
汽水音乐官方网站登录入口_汽水音乐网页版进入链接
在VS Code中利用AI辅助进行代码迁移
什么是Satis,如何用它搭建一个私有的composer仓库?
Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法
2025-12-05
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。