【问题标题】:How to Create a tree from unsorted doubly Link List如何从未排序的双向链表创建树
【发布时间】:2017-12-21 12:38:37
【问题描述】:

我正在努力为未排序的 LinkList 创建一棵树,其中每个节点包含三个实例变量

  1. 身份证
  2. 数据
  3. 父代

LinkList 是数据类型节点,不需要特定类型的树,只需要具有子父关系的基本树

【问题讨论】:

  • 您在哪一部分遇到了问题?
  • @Divyang Mistry by parentid,你的意思是前一个节点的 id,因为现在它只是一个链表,所以我可以认为 parentid 是指向下一个节点的指针吗?
  • 我无法想象如何制作完整的树。我真的不知道从哪里开始。我所做的是通过递归遍历列表并找到根并将其存储在变量中

标签: java data-structures


【解决方案1】:

让我们通过一个例子开始研究这个问题。

以下是提供给我们的列表数据

Pojo{id=4, parent_id=2, name=C} 
Pojo{id=5, parent_id=2, name=D} 
Pojo{id=7, parent_id=3, name=E} 
Pojo{id=6, parent_id=3, name=F} 
Pojo{id=8, parent_id=6, name=FB} 
Pojo{id=1, parent_id=0, name=root} 
Pojo{id=2, parent_id=1, name=A} 
Pojo{id=3, parent_id=1, name=B}

假设我们已经获得了列表的大小,即上述情况下的7

现在根据作者在 cmets 中提供的信息,我假设这是一个 Pojo 对象列表,即List<Pojo> pojoObjects;

现在我们将把树(图)存储在这样的数据结构中 - ArrayList<ArrayList<Pojo>> finalTree = new ArrayList<ArrayList<Pojo>>(7);

现在我们可以遍历我们的列表 - pojoObjects,然后我们可以检查父 ID 是什么,并将这个特定的 Pojo 对象添加到该列表元素。

类似这样的:-

for(Object pojo: pojoObjects) {
    int parentId = pojo.parent_id;
    ArrayList<Pojo> atThisIndex = finalTree[parentId];
    atThisIndex.add(pojo);
    finalTree[parentId] = atThisIndex;
}

在这个循环之后,我们的输出将如下所示:-

0 -> Pojo{id=1, parent_id=0, name=root}
1 -> Pojo{id=2, parent_id=1, name=A} , Pojo{id=3, parent_id=1, name=B}
2 -> Pojo{id=4, parent_id=2, name=c} , Pojo{id=5, parent_id=2, name=D}
3 -> Pojo{id=7, parent_id=3, name=E} , Pojo{id=6, parent_id=3, name=F}
4 -> {}
5 -> {}
6 -> {}
7 -> {}

希望这会有所帮助!

【讨论】:

  • @DivyangMistry 看看,如果您需要更多帮助,请告诉我。
  • 是的,这将是输出,它只是树,就像当你在元素 1 时一样,你可以然后遍历到 2,然后到 4 或 5.... 基于存在的下一个 id在 Pojo 对象中
  • @DivyangMistry 如果这个答案有帮助,你应该将其标记为答案,以便社区知道它已经完成
  • 完美,谢谢,只有一个问题我将如何迭代列表以获取父母 id 2 的所有孩子,你能帮我解决这个问题吗
  • 如果你想要孩子的父母 id 为 2,那么 finalTree[2] 将返回 u ArrayList 并且它的大小将是 2 因为节点是 4 和 5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多