美文网首页
遍历一颗树

遍历一颗树

作者: 嘻哈哈_95fe | 来源:发表于2019-04-04 15:39 被阅读0次

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

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

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

    }

}

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

相关文章

  • 回溯法模板和相关题目

    回溯法的关键在于要画出一颗遍历树,根据树来确定遍历方法:模板(有的题目需要添加visited数组记录遍历状态): ...

  • 03-27:leetcode二叉树的遍历

    主要核心是遍历思路: 前序:根左右 中序:左根右 后序:左右根 针对每一颗树,每一颗树的左右子树都是如此遍历 1、...

  • JS来搞定二叉DOM树的遍历

    js构建一颗二叉树: 前序遍历:首先访问根结点,然后遍历左子树,最后遍历右子树 修改为DOM二叉树: 中序遍历首先...

  • 遍历一颗树

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

  • 7.二叉树前驱节点、后继节点、删除节点

    前序遍历+中序遍历,结果唯一 后序遍历+中序遍历,结果唯一 前序遍历+后序遍历,如果是一颗真二叉树,结果唯一。因为...

  • 二叉树-根据中序和前序遍历结果构造二叉树

    前面学习过根据中序遍历和后序遍历结果构造二叉树,今天是类似的给定一颗树的中序遍历和前序序遍历两个结果数组,构造成一...

  • 145. Binary Tree Postorder Trave

    环境:python 3.6,scala 2.11.8 题意 二叉树的后序遍历 分析 基础题型。 后序遍历:对一颗二...

  • 二叉树-根据中序和后序遍历结果构造二叉树

    今天学习的算法是给定一颗树的中序遍历和后序遍历两个结果数组,构造成一颗二叉树。 题目介绍 如下图所示,给定两个数组...

  • [LeetCode OJ]-Construct Binary T

    题目要求:给定一颗二叉树的中序遍历的数组inorder[]和后序遍历的数组postorder[],构造出这颗二叉树...

  • [LeetCode OJ]- Construct Binary

    题目要求:给定一颗二叉树的中序遍历的数组inorder[]和前序遍历的数组preorder[],构造出这颗二叉树。...

网友评论

      本文标题:遍历一颗树

      本文链接:https://www.haomeiwen.com/subject/upugbqtx.html