Javaのツリーノードの再帰
私は簡単なブログを書いてみることにしましたので、実際には、同様のボーエンの数と多く、しかし、ボーエンの多くは非常に混沌とやや複雑だと思います...
ツリーノードは、一般的に、そのレベルの層を決定することができないので、従来の方法は、一般的にノードツリートラバーサル再帰関数で使用することができます。
利点再帰関数は、読むために、コードに簡単ですが、欠点は、ツリーのレベルが深すぎるメモリオーバーフロー、コードを次のような単純な再帰的なツリートラバーサルを書くための方法を引き起こす可能性があることを示します。
需要があると仮定すると、そのノードは、コードに等しい見つけるためにツリーをトラバースし、次いで、これらのノードに戻す必要があります。
再帰的な実装:
//递归遍历树,主函数入口
public List<Node> findCodeListByTree(List<String> codeList) {
List<Node> nodeList = new ArrayList<Node>(); //储存节点
Node rootNode = tree.getRootNode(); //获取根节点
for(String code : codeList) {
nodeList.addAll(findNodeByChildren(rootNode,code));
}
return nodeList;
}
//递归方法
public List<Node> findNodeByChildren(Node node,String code) {
List<Node> nodeList = new ArrayList<Node>();
if(code.equals(node.getCode())) {
nodeList.add(node);
}
Node childNode = node.getChildren();
if(childNode != null) {
nodeList.addAll(findNodeByChildren(childNode,code));
}
return nodeList;
}
また、非再帰関数を使用して達成することができ、個人的に私はこの実装を好みます。
木の非再帰的、深さ優先探索、それは高度な機能を使用することを意味スタック
//递归遍历树,主函数入口
public List<Node> findCodeListByTree(List<String> codeList) {
List<Node> nodeList = new ArrayList<Node>(); //储存节点
Stack<Node> nodeStack = new Stack<Node>(); //节点栈
Node rootNode = tree.getRootNode(); //获取根节点
nodeStack.add(rootNode);
for(String code : codeList) {
while(!nodeStack.isEmpty()) {
Node node = nodeStack.pop();
if(node.getCode().equals(code)) {
nodeList.add(node);
}
List<Node> childrenNode = node.getChildren();
nodeStack.addAll(childrenNode);
}
}
return nodeList;
}
木の非再帰的、幅優先トラバーサル、あなたはFIFOキュー機能を使用することができます
//递归遍历树,主函数入口
public List<Node> findCodeListByTree(List<String> codeList) {
List<Node> nodeList = new ArrayList<Node>(); //储存节点
Queue<Node> nodeQueue = new LinkedList<Node>(); //节点栈
Node rootNode = tree.getRootNode(); //获取根节点
nodeQueue.offer(rootNode);
for(String code : codeList) {
while(!nodeQueue.isEmpty()) {
Node node = nodeQueue.poll();
if(node.getCode().equals(code)) {
nodeList.add(node);
}
List<Node> childrenNode = node.getChildren();
nodeQueue.addAll(childrenNode);
}
}
return nodeList;
}
何か間違った場所の歓迎があることがあれば、実際のツリーデータので、多くの場面では、サプリメントまで時間がある前に、ちょうど後で比較的単純なツリートラバーサル方法、その後のトラバーサルを与えるために、バイナリではありません!