trq1995 2023-05-29 14:01 采纳率: 100%
浏览 18
已结题

关于#数据结构#的问题,如何解决?

树状表格数据查询问题

有一个表格,其中的数据是树状的,包含多个字段
uid
name
p_uid
other
现在要对这个表格进行 name 的查询,返回树状的结果。其中 name 可以重复,包括父子重复,兄弟重复等。
现在能想到的解决方法,就是全查出来,然后建树,最后递归每一次层,符合要求的存入结果 list 中,但这样耗时也太高了,想问问有没有其他的好的解决方法?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-02 23:07
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自chatgpt:

      对于树状表格数据查询问题,可以考虑使用递归和迭代来实现。

      1. 递归实现

      递归实现要先定义节点类,包含 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)
      
      1. 迭代实现

      迭代实现需要借助辅助数据结构,如队列。首先将根节点加入队列,然后对队列元素逐个弹出,如果名字匹配则加入结果列表中,否则将其子节点加入队列。

      代码如下:

      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)
      

      需要注意的是,由于名字可能重复,所以在向队列中加入子节点时要进行判断,避免重复添加。

      以上是两种可行解决方案,可以根据具体情况选择使用哪种方式。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月27日
  • 已采纳回答 1月19日
  • 创建了问题 5月29日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效