ZBLOG

go语言,一个数据库中的数据结构是这样的:type NginxResourceGroup struct { ID int Pid int Name string Remarks string State int },将其组织为树形结构,其根节点的id固定为1,预先设定好, 并不需要实际建立,剩余节点都在此基础上插入,每次插入要做校验,父节点id是否存在或者为1(父节点就是根节点),插入后是否会破坏树形结构,删除时要删除本身节点及其子节点,如果删除的节点...

可以使用以下示例代码将数据库中的数据组织为树形结构,并进行插入、删除和校验操作:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type NginxResourceGroup struct {
  6. ID int
  7. Pid int
  8. Name string
  9. Remarks string
  10. State int
  11. }
  12. func main() {
  13. upGroups := []NginxResourceGroup{
  14. {ID: 1, Pid: 0, Name: "Root Node", Remarks: "", State: 1},
  15. {ID: 2, Pid: 1, Name: "Node A", Remarks: "", State: 1},
  16. {ID: 3, Pid: 2, Name: "Node B", Remarks: "", State: 1},
  17. }
  18. nodes := make(map[int]*NginxResourceGroup)
  19. for _, node := range upGroups {
  20. nodes[node.ID] = &node
  21. if !isValidTree(nodes) {
  22. fmt.Printf("Invalid tree structure after inserting node %d\n", node.ID)
  23. delete(nodes, node.ID)
  24. }
  25. }
  26. rootNode := nodes[1]
  27. if rootNode == nil {
  28. fmt.Println("No root node found.")
  29. return
  30. }
  31. fmt.Println("Initial tree structure:")
  32. printTree(rootNode, 0, nodes)
  33. insertNode(4, "New Node", rootNode.ID, nodes)
  34. insertNode(5, "New Child Node", 4, nodes) // Invalid insertion
  35. fmt.Println("\nAfter inserting new nodes:")
  36. printTree(rootNode, 0, nodes)
  37. deleteNode(4, rootNode.ID, nodes)
  38. fmt.Println("\nAfter deleting a node:")
  39. printTree(rootNode, 0, nodes)
  40. }
  41. func isValidTree(nodes map[int]*NginxResourceGroup) bool {
  42. for _, node := range nodes {
  43. parent := nodes[node.Pid]
  44. if parent == nil && node.Pid != 0 {
  45. return false
  46. }
  47. }
  48. return true
  49. }
  50. func insertNode(id int, name string, parentId int, nodes map[int]*NginxResourceGroup) {
  51. parent := nodes[parentId]
  52. if parent == nil {
  53. fmt.Printf("Parent node with ID %d does not exist.\n", parentId)
  54. return
  55. }
  56. newNode := &NginxResourceGroup{
  57. ID: id,
  58. Pid: parentId,
  59. Name: name,
  60. Remarks: "",
  61. State: 1,
  62. }
  63. nodes[id] = newNode
  64. if !isValidTree(nodes) {
  65. fmt.Printf("Invalid tree structure after inserting node %d\n", id)
  66. delete(nodes, id)
  67. }
  68. }
  69. func deleteNode(id int, rootNodeId int, nodes map[int]*NginxResourceGroup) {
  70. nodeToDelete := nodes[id]
  71. if nodeToDelete == nil {
  72. fmt.Printf("Node with ID %d does not exist.\n", id)
  73. return
  74. }
  75. delete(nodes, id)
  76. for _, node := range nodes {
  77. if node.Pid == id { // Delete child nodes recursively
  78. deleteNode(node.ID, rootNodeId, nodes)
  79. }
  80. if node.ID == rootNodeId { // If root is deleted, delete all other inserted nodes as well
  81. delete(nodes, node.ID)
  82. }
  83. }
  84. }
  85. func printTree(node *NginxResourceGroup, level int, nodes map[int]*NginxResourceGroup) {
  86. fmt.Printf("%s%s (ID: %d)\n", getIndent(level), node.Name, node.ID)
  87. for _, child := range nodes {
  88. if child.Pid == node.ID {
  89. printTree(child, level+1, nodes)
  90. }
  91. }
  92. }
  93. func getIndent(level int) string {
  94. indent := ""
  95. for i := 0; i < level; i++ {
  96. indent += " "
  97. }
  98. return indent
  99. }

请注意,示例代码中使用了一个nodes映射来存储所有节点,并根据节点的ID进行索引。插入节点时,首先检查父节点是否存在,并且保持树形结构的完整性。删除节点时,将递归地删除其子节点,并在需要时删除根节点以清空整棵树。

此示例代码仅用于演示目的,请根据您的实际需求和数据库操作进行相应修改。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=14040

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?