我在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);
}
}
答案 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()
几乎相同。你可以谷歌算法。这很容易实现。