有一个表格,其中的数据是树状的,包含多个字段
uid
name
p_uid
other
现在要对这个表格进行 name 的查询,返回树状的结果。其中 name 可以重复,包括父子重复,兄弟重复等。
现在能想到的解决方法,就是全查出来,然后建树,最后递归每一次层,符合要求的存入结果 list 中,但这样耗时也太高了,想问问有没有其他的好的解决方法?
对 uid name建立索引
首先按照name把相关记录查询出来,再依次重建出树状关系
对于树状表格数据查询问题,可以考虑使用递归和迭代来实现。
递归实现要先定义节点类,包含 uid、name、p_uid 和 other 四个字段,以及一个子节点列表 children。然后以根节点作为起点,从上往下找到名字匹配的节点并加入结果列表中,并对其子节点递归。
代码如下:
class Node:
def __init__(self, uid, name, p_uid, other):
self.uid = uid
self.name = name
self.p_uid = p_uid
self.other = other
self.children = []
def query_tree(root, name, result):
if root is None:
return
if root.name == name:
result.append(root)
for child in root.children:
query_tree(child, name, result)
迭代实现需要借助辅助数据结构,如队列。首先将根节点加入队列,然后对队列元素逐个弹出,如果名字匹配则加入结果列表中,否则将其子节点加入队列。
代码如下:
def query_tree(root, name, result):
if root is None:
return
queue = [root]
while queue:
node = queue.pop(0)
if node.name == name:
result.append(node)
for child in node.children:
queue.append(child)
需要注意的是,由于名字可能重复,所以在向队列中加入子节点时要进行判断,避免重复添加。
以上是两种可行解决方案,可以根据具体情况选择使用哪种方式。