【发布时间】:2018-05-05 01:19:17
【问题描述】:
我有一个 Spaghetti Stack(一个 N 叉树数据结构,其中子节点具有指向父节点的指针) - 从数据库接收。
从数据库收到的“堆栈”只是一个包含所有节点的列表,因此可以 里面有多个堆栈。
节点是数据库中的记录,其中 parent.id 是另一个相同类型记录的 ForeignKey。
class Node_Category:
def __init__(self, value):
self.value = value
parent_id = id
结构是这样的:
Category 1
-Category 1_1
--Category 1_1_1
-Category 1_2
Category_2
Category_3
-Category 3_1
-Category 3_2
我需要什么:
现在我知道孩子的父母了。从父节点开始,我需要了解他的孩子。
所以我需要遍历“Spaghetti Stack”,将父节点中的连接添加到子节点,这样我就可以从父节点遍历到子节点。
父母可以有 0 个、一个或多个孩子。
因为我不知道堆栈的深度,所以我尝试递归。
我还认为有必要进行某种形式的记忆,因为通过数组循环一个父级的父级会获得多次访问。
我尝试了什么:
def _recurse_for_parents(self, category, path=None):
if path is None:
path = []
path.append(category)
if category.parent:
return self._recurse_for_parents(category.parent, path)
return path
for record in categories:
self._recurse_for_parents(category)
问题:
在循环中我可以点击父级、一级子级、二级等:
Child1_L2-Child1_L1->parent; Child1_L1->parent; parent->Null
Child1_L1->parent; parent->Null
Child2_L1->parent; parent->Null
所以,我在不同深度多次走同一条路。 此外,对于每条路径,我都需要将他的父级链接添加回子级。
【问题讨论】:
-
您需要知道所有节点的子节点,还是一次只知道给定节点?
-
适用于所有节点。我正在考虑创建一个列表列表,例如:[parent [parent-child []],[parent-child [child, child]],我需要将此信息表单后端也传递给前端
-
那么你的问题是什么?
-
我需要一个解决方案/算法/示例来使用递归和记忆化来做到这一点。我多次尝试简单的递归,但没有找到合适的解决方案。因为我从一个包含所有节点的大列表开始,所以我以类似的递归方式输入,我不知道如何添加路径。循环中的父级可以命中 children2-children1-parent, children1->parent,->parent;这是1-1-1的关系。每个父母有多个孩子,深度 5 是不行的。
标签: python algorithm recursion stack tree-traversal