Рекурсивно создать вложенную структуру - PullRequest
0 голосов
/ 11 июля 2019

У меня есть структура следующего формата

type Node struct {
    Id string
    Children []*Node
}

Input

У меня есть следующий ввод

var nestedSlice = [][]string{
        {"60566", "605", "6056"},
        {"60566", "605", "6061"},
        {"60566", "605", "6065"},
        {"60653", "606", "6109"},
        {"60566", "603", "6065"},
    }

код

package main

import (
    //"fmt"
    "github.com/davecgh/go-spew/spew"
)

type Node struct {
    Id       string
    Type     string
    Children []*Node
}

func createNode(values []string, node *Node) *Node {

}

func insert(values []string, nodes []*Node) []*Node {
    if len(nodes) == 0 {
        rootNode := createNode(values, &Node{})
        nodes = append(nodes, rootNode)
        return nodes
    } else {
        for _, node := range nodes {
            if node.Id == values[0] {
                return insert(values[1:], node.Children)
            }
        }
        anotherRoot := &Node{
            Id: values[0],
        }
        nodes = append(nodes, anotherRoot)
    }
    return nodes
}

func main() {
    nodes := make([]*Node, 0, 6)

    var nestedSlice = [][]string{
        {"60566", "605", "6056"},
        {"60566", "605", "6061"},
        {"60566", "605", "6065"},
        {"60653", "606", "6109"},
        {"60566", "603", "6065"},
    }

    for _, value := range nestedSlice {
        nodes = insert(value, nodes)
    }

    spew.Dump(nodes)
}

У меня проблемы с функцией createNode. Я не уверен, как я могу взять фрагмент и создать его, используя рекурсию

Я хочу иметь в конце следующую структуру

[{
    Id: 60566,
    Children: [{
        Id: 605,
        Children: [{
            Id: 6056
        }, {
            Id: 6061
        }, {
            Id: 6065
        }]
    }, {
        Id: 603,
        Children: [{
            Id: 6065
        }]
    }]
}, {
    Id: 60653
    Children: [{
        Id: 606,
        Children: [{
            Id: 6109
        }]
    }]
}]




1 Ответ

0 голосов
/ 11 июля 2019

Это мой подход, я создам Node, а затем добавлю отдельный метод для добавления потомков.

func createNode(id string) *Node{
   return &Node{
      id: id,
      children: make([]*Node, 0)
   }
}

А теперь добавьте узлы.

func(n *Node) addChildren(nodes []*Node){
   for _, node := range nodes{
     n.children.append(node)
   }
}

Но тогда, если хотите, вы можете объединить их.

func createNode(id string, nodes []*Node) *Node{
   p= Node{
      id: id,
      children: make([]*Node, 0)
   }
   for _, node := range nodes{
     p.children.append(node)
   }
   return &p
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...