Java - 具有多个节点的树数据结构 - 如何有效搜索

时间:2017-07-09 07:41:36

标签: java data-structures tree

我正在搜索我拥有的某些类别和子类别的实现/数据结构。我想使用搜索树但不知道如何开始实现。

让我告诉你数据的样子。它从后端开始作为json结构出现在我身上,但它看起来像这样:

  [
    {
      "id": 94,
      "category_name": "New In", //this is the category category_name
      "description": "",
      "children": [ //this is the category children which can also be a sub-category
        {
          "id": 322,
          "category_name": "New Studio",
          "description": "Chic, sophisticated and polished with a classic edge."
        },
        {
          "id": 365,
          "category_name": "New Soho",
          "description": "Fresh, eclectic, and trendy. Oozes effortless cool."
        },
        {
          "id": 809,
          "category_name": "Summer Collection",
          "description": "Your ultimate summer look"
        }
      ]
    },
    {
      "id": 12,
      "category_name": "Clothes",
      "description": "",
      "children": [
        {
          "id": 22,
          "category_name": "All Clothes",
          "description": ""
        },
        {
          "id": 63,
          "category_name": "Tops",
          "description": "",
          "children": [
            {
              "id": 5,
              "category_name": "All Tops",
              "description": ""
            }

          ]
        },
        {
          "id": 641,
          "category_name": "Accessories",
          "description": "",
          "children": [
            {
              "id": 61,
              "category_name": "All Accessories",
              "description": ""
            },
            {
              "id": 622,
              "category_name": "Jewelry",
              "description": "",
              "children": [ // here is an example of a child that is a sub-category also
                {
                  "id": 52,
                  "category_name": "All Jewelry",
                  "description": ""
                },
                {
                  "id": 68,
                  "name": "Necklaces",
                  "description": ""
                },
                {
                  "id": 69,
                  "name": "Bracelets",
                  "description": ""
                },

              ]
            },

  ]

所以,如果我不得不把它画出来,它会看起来像这样:

enter image description here

所以我希望能够获得任何东西。所以,例如,如果我想搜索项链,那么我想要一条项链来获得路径:分类/配件/珠宝/项链

这是否有内置的数据结构?我在java编码。我想我也需要以某种顺序排序的节点,也许是A-Z。

到目前为止,我有这个:

class Node{
 String label;
 List<Node> children;
}

但是如何搜索?并且有更好的数据结构吗?我不想在搜索过程中迭代所有节点,有没有办法对树进行排序,所以我不必这样做?我现在如何拥有它我必须遍历所有的孩子。是否有一种方法可以按字母顺序排序,或者某种排序可以使查找更快?

3 个答案:

答案 0 :(得分:2)

到目前为止,我还不知道任何Java内置数据结构可以处理您正在寻找的内容。 stackoverflow上有一些tree implementations on github或此thread可以帮助您。 但如果我理解你,你也有兴趣在你的树上进行一次表现良好的搜索。 对树进行排序并不能完全解决这个问题,因为您仍然需要搜索每个子树。虽然它可以显着提高搜索性能。但据我所知,Java中没有开箱即用的数据结构。

我想到的另一种方法是使用包含label的地图和对Node的引用。但是,您需要一个树,您可以从树叶到根节点获取完整路径,您必须处理重复的信息。例如。如果删除节点,则还必须在地图中删除它。如果您还想从根遍历树,则可以构建双向树。

这就是我的方法的样子:

class Node {
    String label;
    Node parent;
}

class Tree {
    HashMap<String, List<Node>> tree;
}

如果您有多次相同的标签名称,则为List<Node>。例如。如果您necklacesjewlery

summer collection

答案 1 :(得分:2)

你需要两件事:

在Node对象中,也可以引用父节点:

class Node{
    String label;
    List<Node> children;
    Node parent;
}

创建一个将标签映射到节点的HashMap:

HashMap<String, Node> labelsToNodes;

然后使用HashMap中的get()方法进行搜索。您可以通过重复获取父节点来获取类别列表。如果你想要这个代码,请告诉我,我会添加它(我现在很短时间)。

答案 2 :(得分:1)

本学期我有一个项目用于搜索树木。我使用了不同类型的算法。例如,BFS或DFS取决于您想要的内容以及您希望如何在树中的节点上移动。但是,我更喜欢 IDS (迭代加深深度优先搜索)。要使用此算法,您可以访问此链接。

最好是让父亲而不是孩子,因为它会更好地工作,你不会失去记忆 clip in Youtube to show IDS
complete teaching about IDS
如果你想要你可以问我,还有其他好的算法。 您需要定义一个State类。


    class State{
    String name;
    State father;
    }