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. lintcode :前序遍历和中序遍历树构造二叉树

    解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...

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

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

  3. 多级树的深度遍历与广度遍历(Java实现)

    目录 多级树的深度遍历与广度遍历 节点模型 深度优先遍历 广度优先遍历 多级树的深度遍历与广度遍历 深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看做是一种特殊的图,所以多级数的深/广遍 ...

  4. Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合

    复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...

  5. 图的存储及遍历 深度遍历和广度遍历 C++代码实现

    /*图的存储及遍历*/ #include<iostream> using namespace std; //----------------------------------- //邻接 ...

  6. 遍历树节点(多层)的方法(java)

    前序遍历,后序遍历,广度遍历,深度遍历,遍历一级节点.以及按钮如何响应点击事件. import java.awt.*; import java.awt.event.*; import java.uti ...

  7. Java中树和树的几种常规遍历方法

    其中包含有先序遍历.中序遍历.后序遍历以及广度优先遍历四种遍历树的方法: package com.ietree.basic.datastructure.tree.binarytree; import ...

  8. c/c++连通图的遍历(深度遍历/广度遍历)

    连通图的遍历(深度遍历/广度遍历) 概念:图中的所有节点都要遍历到,并且只能遍历一次. 深度遍历 广度遍历 深度遍历 概念:从一个给定的顶点开始,找到一条边,沿着这条边一直遍历. 广度遍历 概念:从一 ...

  9. 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]

    参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...

随机推荐

  1. java基础-基础类型包装类型

    想要对基本类型数据进行更多的操作,最方便的方式就是将其封装成对象. 为啥呢?因为在对象描述中就可以定义更多的属性和行为对该基本数据类型进行操作. [八种基本数据类型的包装类] byte --Byte ...

  2. html的3要素

    在HTML标记语言中可以将每个网页源码分成3部分: 1.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" &q ...

  3. JQuery 预热

    这是第一次在博客园写随笔,之所以有这样的冲动是因为每次看到很多园友不断的发表文章,记录下自己的点点滴滴,内心就在不断的忏悔,我很敬佩这种人,不管他们表达的东西是初级还是精辟,我认为只要去坚持写了就是一 ...

  4. centos6.4下安装freetds使php支持mssql

    centos版本:6.4 php版本5.3.17 没有安装之前的情况:nginx+php+mysql+FPM-FCGI 接下来安装步骤如下: 1.打开http://www.freetds.org/,进 ...

  5. 解决 windows2012 下无法安装 sql2008R2

    Press the Windows logo key, type control panel, and then click the Control Panel icon. Note If you a ...

  6. WPF简单入门总结

    WPF简单总结 最近看了点关于WPF的东西,总结了点点入门的东西. XAML语法基础 1.  定义样式 <Window.Resources><!--窗体资源的定义--> < ...

  7. Android Studio 导入第三方jar包

    1.先将AS切换到Project 2.在app-main-src下建一个libs目录,将jar包拷到里面 3.右击jar,add as Library

  8. envi中多波段图层叠加layer stacking

    Basic Tools——layer stacking 选择投影和输出的文件 波段1-7波段图层都叠加在一个文件中了

  9. Xcode免证书打包ipa

    1,创建证书 打开“钥匙串访问”创建证书 填写好内容后点击继续,之后的步骤什么都不用改,一路点击“确定”和“继续”,最后完成这个向导就可以了. 我们创建的证书是不被信任的,右键点击证书选择“显示简介” ...

  10. validate[.unobtrusive]和Bootstrap实现tooltip错误提示

    validate[.unobtrusive]和Bootstrap实现tooltip错误提示 类似的文章园子里已有,请看这里,个人感觉稍显复杂,日前也打算写一个简单的给项目用,一些关键点记录于此.最终效 ...