遍历一颗树

由于没有系统的学习过,所以最近在看算法方面的基础知识点,正好看见数据结构中的树,以前也没有用过,正好写一下。

首先构建一棵树,只创建了子节点属性

public class TreeNode {

Listchildren =new ArrayList();

    public ListgetChildren() {

return children;

    }

public void setChildren(List children) {

this.children = children;

    }

public static ListgetCildren(TreeNode parent){

return parent.getChildren();

    }

}

    说道遍历,就不得不提深度和广度的问题,广度遍历就是先把同一深度的所有节点遍历完成,如果这些节点中存在子节点,那么再同一遍历下一层深度的所有节点,知道完成为止,而深度遍历呢就是把一条分支一直遍历到终点,再也找不到子级为止,再找上一级有没有同级节点,继续向下遍历

    因为不知道树到底有多深,所以首先想到的就是递归,那么递归,先想到了深度递归,这个比较简单:

//深度递归

public void depthRecursion(){

//输入List

    List trees =new ArrayList();

    if(trees !=null && trees.size()>0){

for(TreeNode child : trees){

//TODD

            recursionDepth(child);

        }

}

//输入树节点

    TreeNode tree =new TreeNode();

    recursionDepth(tree);

}

public void recursionDepth(TreeNode tree){

List children = TreeNode.getCildren(tree);

    if(children !=null && children.size()>0){

for(TreeNode child : children){

//TODD

            recursionDepth(child);

        }

}

}

    那优先遍历广度呢?广度的话,就想到了用循环,for循环?不行,用for的话循环次数是已知的,但是从第二次循环开始我们就不知道需要循环多少次了,所以使用while循环,可以无限循环,而且也能很方便结束循环

//广度遍历树

public void traverseFor(){

TreeNode parent =new TreeNode();

    List children = TreeNode.getCildren(parent);

    while (children !=null && children.size()>0){

List curentTreeNode,

                allChildren =new ArrayList();

        for (TreeNode child : children){

//TODD

            curentTreeNode = TreeNode.getCildren(child);

            if(curentTreeNode !=null && curentTreeNode.size()>0){

allChildren.addAll(curentTreeNode);

            }

}

children = allChildren;

    }

}

    当然,上面这个遍历也能使用递归实现,只是使用递归替换了while的功能

   //广度递归

public void widthRecursion(){

//输入List

    List trees =new ArrayList();

    recursionWidth(trees);

    //输入树节点

    TreeNode tree =new TreeNode();

    recursionWidth(TreeNode.getCildren(tree));

}

public void recursionWidth(List trees){

List curentTreeNode,

            allChildren =new ArrayList();

    for (TreeNode child : trees){

//TODD

        curentTreeNode = TreeNode.getCildren(child);

        if(curentTreeNode !=null && curentTreeNode.size()>0){

allChildren.addAll(curentTreeNode);

        }

}

if(allChildren !=null && allChildren.size()>0){

recursionWidth(allChildren);

    }

}

    树好像有且只有一个根节点。囧。。。反正是为了遍历。就当是多棵树好了。哈哈!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。