65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
|
|
package diagram
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"github.com/gofrs/uuid"
|
||
|
|
)
|
||
|
|
|
||
|
|
// MultiBranchTreeNode represents a topological structure using an multi branch tree
|
||
|
|
type MultiBranchTreeNode struct {
|
||
|
|
ID uuid.UUID // 节点唯一标识
|
||
|
|
NodeComponentType int // 节点组件类型
|
||
|
|
Parent *MultiBranchTreeNode // 指向父节点的指针
|
||
|
|
Children []*MultiBranchTreeNode // 指向所有子节点的指针切片
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewMultiBranchTree(id uuid.UUID, componentType int) *MultiBranchTreeNode {
|
||
|
|
return &MultiBranchTreeNode{
|
||
|
|
ID: id,
|
||
|
|
NodeComponentType: componentType,
|
||
|
|
Children: make([]*MultiBranchTreeNode, 0),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *MultiBranchTreeNode) AddChild(child *MultiBranchTreeNode) {
|
||
|
|
child.Parent = n
|
||
|
|
n.Children = append(n.Children, child)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *MultiBranchTreeNode) RemoveChild(childID uuid.UUID) bool {
|
||
|
|
for i, child := range n.Children {
|
||
|
|
if child.ID == childID {
|
||
|
|
n.Children = append(n.Children[:i], n.Children[i+1:]...)
|
||
|
|
child.Parent = nil
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *MultiBranchTreeNode) FindNodeByID(id uuid.UUID) *MultiBranchTreeNode {
|
||
|
|
if n.ID == id {
|
||
|
|
return n
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, child := range n.Children {
|
||
|
|
if found := child.FindNodeByID(id); found != nil {
|
||
|
|
return found
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *MultiBranchTreeNode) PrintTree(level int) {
|
||
|
|
for i := 0; i < level; i++ {
|
||
|
|
fmt.Print(" ")
|
||
|
|
}
|
||
|
|
|
||
|
|
fmt.Printf("- ComponentType:%d,(ID: %s)\n", n.NodeComponentType, n.ID)
|
||
|
|
|
||
|
|
for _, child := range n.Children {
|
||
|
|
child.PrintTree(level + 1)
|
||
|
|
}
|
||
|
|
}
|