Javaの再帰的、ツリーノードの非再帰的深さ優先トラバーサル〔、幅優先]

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;
}

 

何か間違った場所の歓迎があることがあれば、実際のツリーデータので、多くの場面では、サプリメントまで時間がある前に、ちょうど後で比較的単純なツリートラバーサル方法、その後のトラバーサルを与えるために、バイナリではありません!

公開された21元の記事 ウォンの賞賛9 ビュー30000 +

おすすめ

転載: blog.csdn.net/a5552157/article/details/83717148