在Java中遍历和过滤树

时间:2015-05-04 09:50:47

标签: java

我在Java中有一个非二叉树(参见下面的代码),给定一个输入字符串,我需要按节点名称过滤其节点。如果我找到一个节点,那么整个父链应该出现在结果中,即使父名称不匹配。

我想从树叶开始向上穿过树,但不知道该怎么做。有什么想法吗?

更新

结果应该是同一棵树,但是有过滤的叶子,而不是叶子列表。

Java代码:

public class Tree<T> {

    Node<T> root = null;


    public Tree(Node <T> rootNode) {
        root = rootNode;
    }


    public Node<T> searchFromRoot(int idToSearch) {
        return recursiveSearch(idToSearch, root);
    }



    private Node<T> recursiveSearch(int idToSearch, Node<T> node){


        List <Node<T>>children = node.getChildren(); 

        Node<T> result = null;

        for ( Node<T> node2 : children ) {

            result = recursiveSearch(idToSearch, node2);

            if (result != null)
                break;

        }

        return result;
     }


    public Node<T> getRoot() {
        return root;
   }



}


public class Node<T> {


    private List<Node<T>> children = new ArrayList<Node<T>>();

    private Node<T> parent = null;

    private T data = null;

    private int id = 0;


    public static final int NODE_TYPE_FOLDER = 0;

    private int nodeType = 0;

    public Node(int id, int nodeType, T data) {
        this.id = id;
        this.nodeType = nodeType;
        this.data = data;
    }

    public Node(T data, Node<T> parent) {
        this.data = data;
        this.parent = parent;
    }


    public boolean isLeaf() {
        if (this.children.size() == 0)
            return true;
        else
            return false;
    }



// getters and setters

    public void addChild(int id, int nodeType, T data) {
        Node<T> child = new Node<T>(id,nodeType,data);
        child.setParent(this);
        this.children.add(child);
    }

    public void addChild(Node<T> child) {
        child.setParent(this);
        this.children.add(child);
    }


    public boolean isRoot() {
        return (this.parent == null);
    }


} 

2 个答案:

答案 0 :(得分:1)

假设您有list包含所有树叶,并且您需要搜索name

HashSet<String> result = new HashSet();
for( Node leaf: list)
   search(false, name, leaf, result);


public void search(boolean found, String name, Node node, HashSet<String> result){
    if(node == null)
       return;
    found = found ? found : node.getName().equals(name);
    if(found)
       result.add(node.getId());

    search(found, name, node.getParent(), result);
}

更新

因此,我们可以只存储包含所有已过滤节点ID的ArrayList,而不是HashSet,这样您就可以从根遍历树,并检查节点的id是否在结果集与否,它可以帮助您重建树。

答案 1 :(得分:0)

您需要一个Post Order遍历算法。它应该与您的方法recursiveSearch()几乎相同。你可以谷歌算法。这很容易实现。

http://en.wikipedia.org/wiki/Tree_traversal#Post-order