记一次二叉树(多叉树)的深度和广度优先遍历在项目中的真实应用

    技术2025-11-19  22

    技术类的项目-选品:为方便各业务模块在做营销活动时能够根据商家过往的行为数据快速根据条件筛选出符合条件的目标商家,从而实现推送精准化的营销活动。类似与构建商家画像平台。

     

     选品项目包含的模块:(1)数据源接入 (2)数据采集 (3)标签建立 (4)筛选商家

      

       整体流程图

     

    3、执行筛选流程

    (1) 调用筛选服务启动筛选任务: ADMarketingSelectionServiceImpl.executeSelection(long id, ADMarketingSelectionExecuteType executeType)->SelectionService.executeSelection()->

    (2)调用筛选处理器执行开启筛选流程: SelectionProcessor.process()

    (3)执行解析处理器:SelectionParserProcessorHandler.handler()

    (4) 执行查询处理器:SelectionQueryProcessorHandler.handler()

    (5) 执行聚合处理器:SelectionAggregationProcessorHandler.handler()

    (6) 执行查询结果处理器: SelectionQueryOutputProcessorHandler.handler()

    (7) 执行查询导出处理器:SelectionOutputProcessorHandler.handler()

     

     

    我做的模块:复杂标签筛选模块

    (1)复杂标签的定义:标签包含子标签,也有可能子标签中包含孙子标签,但是同一level的标签的关系是一致的,即并、或、差的关系

    一个场景包含多个复杂标签的树形

     

    public class ResultCondition { private long FatherId; private int relation; private List<Condition> conditions; public void setFatherId(long fatherId) { FatherId = fatherId; } public void setConditions(List<Condition> conditions) { this.conditions = conditions; } public long getFatherId() { return FatherId; } public int getRelation() { return relation; } public void setRelation(int relation) { this.relation = relation; } public List<Condition> getConditions() { return conditions; } } public class Condition { private long id; private String name; private int relation; private List<Condition> complexCondition; public Condition(long id) { this.id = id; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getRelation() { return relation; } public void setRelation(int relation) { this.relation = relation; } public List<Condition> getComplexCondition() { return complexCondition; } public void setComplexCondition(List<Condition> complexCondition) { this.complexCondition = complexCondition; } } public static Stack<ResultCondition> getBFS(ADMarketingSelectionScenesPO root) { Stack<ResultCondition> stack = new Stack<>(); if (root == null) { return stack; } Queue<Condition> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { List<Condition> subList = new ArrayList<>(); Condition condition = queue.poll(); ResultCondition resultCondition = new ResultCondition(); resultCondition.setFatherId(condition.getId()); resultCondition.setRelation(condition.getRelation()); if (condition.getComplexCondition() != null) { for (Condition cd : condition.getComplexCondition()) { queue.add(cd); subList.add(cd); } resultCondition.setConditions(subList); stack.push(resultCondition); } } } return stack; }

    (3)此算法输入一个包含很多层的条件组合,输出一个包含ResultCondition元素的栈,图型如下:

     

     

     

    Processed: 0.015, SQL: 9