> 백엔드 개발 > Golang > 경로 문자열 목록에서 계층적 트리 구조를 구축하는 방법은 무엇입니까?

경로 문자열 목록에서 계층적 트리 구조를 구축하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-31 00:15:29
원래의
912명이 탐색했습니다.

How to Build a Hierarchical Tree Structure from a List of Path Strings?

경로 구조를 트리로 변환

경로 문자열 모음에서 중첩된 데이터 구조를 개발하는 것은 특히 문제를 다룰 때 어려울 수 있습니다. 포인터와 재귀. 경로 구조 배열에서 계층적 트리를 생성하는 솔루션을 조사해 보겠습니다.

다음 예를 고려하세요.

s:=[]string {
  "a/b/c",
  "a/b/g",
  "a/d"
}
로그인 후 복사

우리의 목표는 다음 JSON 구조와 유사한 트리를 구성하는 것입니다.

{
 "name": "a",
 "children": [
     {
      "name": "b",
      "children": [
        {
         "name": "c",
         "children": []
        },
        {
         "name": "g",
         "children": []
        }
      ]
    },
    {
     "name": "d",
     "children": []
    }
  ]
}
로그인 후 복사

이를 달성하기 위해 기존 트리와 경로 세그먼트 목록을 사용하는 AddToTree라는 재귀 함수를 구현합니다.

func AddToTree(root []Node, names []string) []Node {
    if len(names) > 0 {
        var i int
        for i = 0; i < len(root); i++ {
            if root[i].Name == names[0] { //already in tree
                break
            }
        }
        if i == len(root) {
            root = append(root, Node{Name: names[0]})
        }
        root[i].Children = AddToTree(root[i].Children, names[1:])
    }
    return root
}
로그인 후 복사

이 함수는 기존 트리를 탐색하여 지정된 노드가 이미 존재합니다. 그렇다면 경로의 다음 세그먼트로 진행됩니다. 그렇지 않으면 지정된 이름으로 새 노드를 생성하여 기존 트리에 추가합니다.

Example output (note that I used omitempty on the children field, because I don't like null entries in my JSONs):

[{
    "name": "a",
    "children": [{
        "name": "b",
        "children": [{
            "name": "c"
        }, {
            "name": "g"
        }]
    }, {
        "name": "d"
    }]
}]
로그인 후 복사

저희 솔루션은 다음과 같은 주요 측면에서 원래 접근 방식과 다릅니다.

  • 단일 노드의 자식이 아닌 노드의 목록으로 동작합니다.
  • 기존 노드를 재사용하지 않고 새로운 노드를 생성하여 중복을 방지합니다.
  • 트리에서 기존 노드를 확인하고, 각 노드가 한 번만 추가되는지 확인하세요.

위 내용은 경로 문자열 목록에서 계층적 트리 구조를 구축하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿