【问题标题】:Search for any node in non binary tree and keep their parents intact even if multiple nodes are found搜索非二叉树中的任何节点,即使找到多个节点,也保持其父节点不变
【发布时间】:2018-02-16 14:00:25
【问题描述】:

我正在尝试构建一种算法,该算法将针对任何搜索查询搜索树中的某些节点。 例如,在我们的应用程序树中填充了所有节点,包括 两个 名称为 Roles 的节点,一个属于父名称 Data,另一个属于一个属于父名称System。现在,如果我提供 roles 搜索条件,则应使用具有父级的角色过滤树并删除所有其他节点,如下所示:

 Data
     -> Roles
 System
     -> Roles

我一直在努力获得这样的结果,但使用我目前开发的算法

  private TreeNodeDTO filterTree(String search,TreeNodeDTO    
    treeNodeDTO)
  {
    if ( treeNodeDTO.getTitle().equalsIgnoreCase( search ) ) {
        return treeNodeDTO;
    }
    List< TreeNodeDTO > children = treeNodeDTO.getChildren();
    TreeNodeDTO treeNodeDTOResult = null;
        for ( int i = 0; treeNodeDTOResult == null && i <   children.size(); i++ ) {
            treeNodeDTOResult = filterTree( search, children.get( i  ) );
        }
    return treeNodeDTOResult;
  }   

我只得到不是要求的第一个找到的节点。

Data
 -> Roles

虽然我需要以下结果

 Data
     -> Roles
 System
     -> Roles

我还尝试修改现有的树结构来跟踪父母和孩子,并设置标志来跟踪父母,但我仍然坚持填充最终结果。

这是我的 treeNode 类

 public class TreeNodeDTO {

  /** The id. */
  private String id;

 /** The title. */
 private String title;

 /** The children. */
 private List<TreeNodeDTO> children;

 //setters and getters
}

【问题讨论】:

    标签: java tree stream


    【解决方案1】:

    我已经修改了您的搜索算法,使其现在是 TreeNodeDTO 类的成员,这是一种更好的面向对象的方法。此外,搜索必须返回如下列表:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class TreeNodeDTO {
    
        /** The id. */
        private String id;
    
        /** The title. */
        private String title;
    
        /** The children. */
        private List<TreeNodeDTO> children;
    
        private List<TreeNodeDTO> recursiveSearch(String search) {
            if ( getTitle().equalsIgnoreCase( search ) ) {
                return Arrays.asList(this);
            }
            ArrayList<TreeNodeDTO> resultList = new ArrayList<>();
            for (TreeNodeDTO child : getChildren()) {
                resultList.addAll(child.recursiveSearch(search));
            }
            return resultList;
        }
    
        public String getId() {
            return id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public List<TreeNodeDTO> getChildren() {
            return children;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多