|
...
|
...
|
@@ -15,23 +15,6 @@ type Tree struct { |
|
|
|
Nodes []*Tree `json:"nodes"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func traverse(tree *Tree, node TreeNode) bool {
|
|
|
|
list := tree.Nodes
|
|
|
|
var match bool = false
|
|
|
|
for i := range list {
|
|
|
|
id, pid := list[i].Node.ID(), node.PID() //list[i].Node.PID() == node.ID()
|
|
|
|
if pid == id {
|
|
|
|
list[i].Nodes = append(list[i].Nodes, NewTree(node))
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
if match || traverse(list[i], node) {
|
|
|
|
match = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return match
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewTrees(nodes []TreeNode) *Tree {
|
|
|
|
var tree = &Tree{
|
|
|
|
Node: nil,
|
|
...
|
...
|
@@ -52,3 +35,73 @@ func NewTree(node TreeNode) *Tree { |
|
|
|
Nodes: make([]*Tree, 0),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AllChildNodes 返回node下所有子节点
|
|
|
|
func (tree *Tree) AllChildNodes(node TreeNode) []TreeNode {
|
|
|
|
treeNode := tree.find(node)
|
|
|
|
if treeNode == nil {
|
|
|
|
return []TreeNode{}
|
|
|
|
}
|
|
|
|
return tree.allChild(treeNode)
|
|
|
|
}
|
|
|
|
|
|
|
|
// find 查询node所在的tree,并且返回
|
|
|
|
func (tree *Tree) find(node TreeNode) *Tree {
|
|
|
|
var stack []*Tree
|
|
|
|
stack = append(stack, tree)
|
|
|
|
var find *Tree
|
|
|
|
for {
|
|
|
|
if len(stack) == 0 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
pop := stack[0]
|
|
|
|
stack = stack[1:]
|
|
|
|
stack = append(stack, pop.Nodes...)
|
|
|
|
if pop == nil || pop.Node == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if pop.Node.ID() == node.ID() {
|
|
|
|
find = pop
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return find
|
|
|
|
}
|
|
|
|
|
|
|
|
// allChild 返回treeNode下所有子节点
|
|
|
|
func (tree *Tree) allChild(treeNode *Tree) []TreeNode {
|
|
|
|
var stack []*Tree
|
|
|
|
stack = append(stack, treeNode)
|
|
|
|
var res []TreeNode
|
|
|
|
for {
|
|
|
|
if len(stack) == 0 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
pop := stack[0]
|
|
|
|
stack = stack[1:]
|
|
|
|
stack = append(stack, pop.Nodes...)
|
|
|
|
res = append(res, pop.Node)
|
|
|
|
}
|
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
|
|
|
// traverse 遍历节点
|
|
|
|
//
|
|
|
|
// tree 当前树
|
|
|
|
// node 判断的节点
|
|
|
|
func traverse(tree *Tree, node TreeNode) bool {
|
|
|
|
list := tree.Nodes
|
|
|
|
var match bool = false
|
|
|
|
for i := range list {
|
|
|
|
id, pid := list[i].Node.ID(), node.PID() //list[i].Node.PID() == node.ID()
|
|
|
|
if pid == id {
|
|
|
|
list[i].Nodes = append(list[i].Nodes, NewTree(node))
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
if match || traverse(list[i], node) {
|
|
|
|
match = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return match
|
|
|
|
} |
...
|
...
|
|