【问题标题】:Get nodes and group them based on specific inputs from user获取节点并根据用户的特定输入对它们进行分组
【发布时间】:2020-08-26 21:21:11
【问题描述】:

我有一棵二叉树。 每个节点都是一个具有 2 个值的结构:宽度和长度。

用户的输入是根据一个或两个标准(高度、宽度)对它们进行分组。 对于此分组,仅考虑叶节点。 考虑附图中的树。 如果用户说基于长度的组,结果将是 [8,5,7],因为它的长度是 20,而 [9,6] 因为它的长度是 10。

如果用户根据长度和宽度说组,那么输出将是 [8,5] w=20,l=30 , [9,6] l=10,w=20 , [7] l=20, w=10

我的处理方法是遍历树两次并收集 2 个“列表列表”并对其进行处理以获得一个新的“列表列表”,它将唯一的 l&w 值组合在一起。

用户还可以选择将级别作为输入。如果将级别作为输入给出,那么相同的步骤会发生在该级别而不是叶节点。

有没有比我提到的更好的方法来做到这一点? PS。我正在用 C++ 编写这段代码。

【问题讨论】:

    标签: c++ algorithm data-structures tree tree-traversal


    【解决方案1】:

    数据:

    用字段构造一个对象列表

    • 长度
    • 宽度
    • 级别

    您可以通过执行级别顺序遍历来创建此“主”列表。

    并从主列表构造以下列表:

    • 一个length-level-sorted list : 先按长度再按级别排序的列表

    • 按宽度排序的列表:先按宽度排序,再按级别排序的列表

    • 长宽级别排序列表:先长后宽后级别排序的列表

    查询(log n):

    • 对于长度查询:对长度级排序列表进行二分搜索,查找找到的索引和右侧索引左侧的所有对象并返回组 - 应该是O(log(n))

    • 对于宽度查询:对宽度级排序列表执行相同操作 - 应为 O(log(n))

    • 对于长度和宽度查询:首先按长度然后按宽度对长度-宽度级排序列表进行二进制搜索 - 应该是O(log(n))

    • 对于级别选项:如果级别包含在上述任何查询中的查询中 - 只需按级别进行二分搜索 - 应再次为 O(log(n))

    【讨论】:

    • 感谢您的回答。我不清楚您所说的“先按长度排序,然后按水平排序”是什么意思。如果你第二次为不同的参数对列表进行排序,第一次排序不会变得多余吗?
    • 考虑这个列表:(l=10, w=30, level=2), (l=10, w= 10,level=1), (l=5, w=15,level =3)“先按长度排序,然后按级别排序”意味着它将首先按长度排序,结果为:(l=5, w=15, level=3), (l=10,w=30,level=2) , (l=10, w=10, level=1) 然后按长度排序,得到: (l=5, w=15, level=3), (l=10, w=10, level=1) , (l=10, w=30, level=2) 所以它只有在长度之间存在联系时才会改变,否则不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2017-03-29
    • 1970-01-01
    • 2020-08-09
    • 2015-08-24
    • 2021-08-24
    相关资源
    最近更新 更多