java遍历树
如现有以下一颗树:A     B          B1               B11          B2               B22     C          C1               C11               C12          C2     D          D1               D11

第一种方式深度优先遍历 (最终返回的一棵压扁的树,依次从上往下)使用Stack,由于stack是先进后出,故实现方式为:
首先push一个初始节点到stack中,假定为A,
循环这个stack,只要不为空则循环不结束,从stack中pop出第一个元素,把次元素放到一个list中,作为树的返回结果显示,获取次元素的下一级子元素,如果有则把他们都push到stack中。
首先第一次进入循环的stack中只有A,把A元素从stack中pop出来后,第一个被放到list里,然后获取到A的一级子元素(BCD),把他们push到stack中,此时stack中有三个元素(BCD),进入第二次循环。
这次循环从stack中pop出第一个元素B(注:这里的BCD获取的先后顺序符合先进后出原则)把B元素从stack中pop出来后,第一个被放到list里,然后获取到A的一级子元素(B1B2),把他们push到stack中,此时stack中有元素(B1B2CD),进入第三次循环。
这次循环从stack中pop出的应该是B1或者B2中的一个,后面和上诉的循环一致。
获取的结果为A B B1 B11 B2 B22 C C1 C11 C12 C2 D D1 D11
第二种方式广度优先遍历使用list,由于list是集合,集合是先进先出,故实现方式为:
首先add一个初始节点到list中,假定为A,循环这个list,只要不为空,则循环不结束,从这个list中取出第一个元素即A放到result(假定也是一个list)中,并且remove这个元素。然后获取到A的一级子元素(BCD),把他们放到list中,此时list中有三个元素(BCD),进入第二次循环。
这次循环从list中取出第一个元素即B然后放到result中,并且remove这个元素。把B的一级子元素(B1B2)放入result中,此时list中元素为(CDB1B2),进入第三次循环。
这次循环和上两次一样,取出的第一个元素是C。
获取的结果为A B C D B1 B2 C1 C2 D1 B11 B22 C11 C12 D11

代码试例:

package com.order;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Stack;
public class MytreeOrder {private static List<String> allElement = new ArrayList<String>();public static void setElement() {allElement.add("A");allElement.add("A1");allElement.add("A2");allElement.add("A3");allElement.add("A4");allElement.add("A11");allElement.add("A21");allElement.add("A22");allElement.add("A41");allElement.add("A42");allElement.add("A111");allElement.add("A421");}public static void main(String[] args) {setElement();deepOrder("A");broadOrder("A");}// 深度遍历public static void deepOrder(String oneElement) {if (allElement.contains(oneElement)) {Stack<String> s = new Stack<String>();s.push(oneElement);while (!s.isEmpty()) {String now = s.pop();StringBuffer t = getSpace(now);System.out.println(t.toString() + now);s.addAll(getChild("deep", now));}}}// 根据传入的string元素来返回需要的空格private static StringBuffer getSpace(String now) {StringBuffer t = new StringBuffer("");for (int i = 0; i < now.length(); i++) {t.append(" ");}return t;}// 获取子元素private static Collection<String> getChild(String mode, String oneElement) {List<String> childs = new ArrayList<String>();for (int i = 0; i < allElement.size(); i++) {if (allElement.get(i).toString().length() == oneElement.length() + 1&& (allElement.get(i).toString().substring(0,oneElement.length()).equals(oneElement))) {if (mode.equals("deep")) {// 此处保证集合中最后一个元素是需要显示在当前层级中第一个展示的子节点(因为堆栈中是最后一个元素先出)if (childs != null&& childs.size() != 0&& Integer.valueOf(allElement.get(i).toString().substring(1)) > Integer.valueOf(childs.get(0).toString().substring(1))) {childs.add(0, allElement.get(i));} else {childs.add(allElement.get(i));}} else {if (childs != null&& childs.size() != 0&& Integer.valueOf(allElement.get(i).toString().substring(1)) < Integer.valueOf(childs.get(0).toString().substring(1))) {childs.add(0, allElement.get(i));} else {childs.add(allElement.get(i));}}}}return childs;}// 广度遍历private static void broadOrder(String oneElement) {if (allElement.contains(oneElement)) {List<String> l = new ArrayList<String>();l.add(oneElement);while (!l.isEmpty()) {String now = l.get(0);l.remove(0);StringBuffer t = getSpace(now);System.out.println(t.toString() + now);l.addAll(getChild("broad", now));}}}
}

java遍历树(深度遍历和广度遍历)相关推荐

  1. JAVA 获取树的所有路径-深度优先遍历和广度优先

    1.示例 树的结构 示例中本身构建了图片中的这棵树 树节点模型: public class TreeNode {String value;List<TreeNode> children;p ...

  2. 二叉树的各种操作(递归和非递归遍历,树深度,结点个数等等)

    目录 建立二叉树 递归前序和非递归前序 递归中序和非递归中序 递归后续和非递归后续(包括双栈法和设置pre结点) 层次遍历 寻找树中有没有值为x的结点 统计树中结点的个数 计算树的高度 判断两颗树是不 ...

  3. 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径

    图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...

  4. java 二叉树的深度、平衡二叉树、二叉树的下一个结点

    1. 二叉树的深度 1. 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2. 求解思路 可以用后序遍历,从最后一层 ...

  5. 数据结构与算法之二叉树广度遍历、深度遍历总结

    什么是树,它是和链表一样都是一种抽象数据类型(ADT),包括数据结构和对数据的操作. 树是一种二维平面的数据结构结构,它也是由节点组成的,只是它的后继节点不止一个,而链表的后继节点只有一个. 树具有以 ...

  6. 图的深度遍历和广度遍历算法

    图的深度遍历和广度遍历算法 图的深度遍历可以简单理解为一条道走到黑,首先访问图中任一起始顶点v,再访问与v顶点邻接且未被访问过的顶点w1,再访问与w1邻接且未被访问过的顶点w2,重复上述操作,若不能继 ...

  7. 爱情呼叫转移-深度广度遍历合集

    1.这件事是特殊的,还是普遍的? 工作中常常会遇到各种各样的问题,不管黑猫白猫,抓到老鼠就是好猫.哪只猫好,往往需要对比分析. 如何做数据对比,需要加入哪些数据来分析,在哪里进行数据对比,例如频率.功 ...

  8. 邻接矩阵的深度遍历和深度遍历

    #include<iostream> const int MAX_VERTEX = 10; using namespace std; int visitd[MAX_VERTEX] = {0 ...

  9. LintCode-73.前序遍历和中序遍历树构造二叉树

    前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 ...

  10. js遍历树,多层嵌套for循环,递归

    js遍历树,多层嵌套for循环,递归 一.目的 源数据示例 二.如何获得数据 多层for循环嵌套遍历树数据 递归遍历树数据 一.目的 遍历获取树数据中的部分数据. 源数据示例 menuType=2的数 ...

最新文章

  1. 鱼佬:我的数据挖掘之路!
  2. 关于FTP上传方法 (by Liang)
  3. python 打包图标_Python打包成exe文件很难?一分钟即可学会,并添加图标!
  4. [开源].NET数据库访问框架Chloe.ORM
  5. 移动三国己然鼎立,普​通开发者如何选择开发​平台?
  6. HTML5 网站大观:12个优秀的 HTML5 黑色风格网站设计
  7. MATLAB双纵坐标绘图(重要)
  8. Generative Adversarial Networks 生成对抗网络的简单理解
  9. java在线预览txt、word、ppt、execel,pdf代码
  10. 计算机408考研专题(建议收藏)
  11. 前端学习(1802):前端调试之事件伪类练习
  12. java dispose方法_java-dispose方法
  13. ar自回归 python_时间序列分析 | 向量自回归模型
  14. 并行计算、分布式计算、网格计算讲解
  15. excel中如何实现自动求和?
  16. 乐动手环app下载安装_乐动健康手环app下载-乐动健康客户端v2.34 安卓最新版 - 极光下载站...
  17. 软件开发七宗罪(转发)
  18. 基于SSM java学校教务管理系统
  19. 树莓派制作遥控小车教程
  20. 别让生气毁了你的生活(深度好文)

热门文章

  1. 2013年中国android智能手机用户调查研究报告,ZDC:2013年7月中国智能手机市场分析报告...
  2. 转载:如何与老板谈加薪
  3. Python Monte Carlo K-Means聚类实战研究
  4. python 输出三角形字符阵列 本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。
  5. type=submit表单提交理解
  6. 最新!互联网大厂各职级薪资对应关系图(2020年初)
  7. 4, excel vba 往单元格里写入数据
  8. 寡言,而心存一片海。
  9. YY一下VR游戏的潜入玩法
  10. 【软考系统架构设计师】2009年下系统架构师案例分析历年真题