1、示例

树的结构

示例中本身构建了图片中的这棵树
树节点模型:

public class TreeNode {String value;List<TreeNode> children;public TreeNode() {children = new ArrayList<>();}public TreeNode(String value) {this.value = value;children = new ArrayList<>();}@Overridepublic String toString() {// TODO Auto-generated method stubreturn value;}
}

构建树:

// 建立一棵树
TreeNode root = new TreeNode("A");
// 第二层
root.children.add(new TreeNode("B"));
root.children.add(new TreeNode("C"));
// 第三层
root.children.get(0).children.add(new TreeNode("D"));
root.children.get(0).children.add(new TreeNode("E"));
root.children.get(1).children.add(new TreeNode("F"));
root.children.get(1).children.add(new TreeNode("H"));
root.children.get(1).children.add(new TreeNode("G"));
// 第四层
root.children.get(0).children.get(1).children.add(new TreeNode("I"));

2、遍历方式

① 递归形式的深度优先遍历

/*** 深度优先遍历(递归方式) --- 树(Tree)*/public void recurTree(TreeNode root) {List<List<String>> result = new ArrayList<>();List<String> path = new ArrayList<>();path.add(root.value);findPath(result, root, path);System.out.println(result);}private void findPath(List<List<String>> result, TreeNode node, List<String> path) {if (node.children == null || node.children.size() <= 0) {result.add(path);return;}for (int i = 0; i < node.children.size(); i++) {TreeNode child = node.children.get(i);List<String> cPath = new ArrayList<>();cPath.addAll(path);cPath.add(child.value);findPath(result, child, cPath, target);}}

② 非递归的深度优先遍历

/*** 深度优先遍历(非递归方式) ----- 查找树的全部叶子路径* * @param root*            根节点* @return 叶子路径的集合*/public List<List<TreeNode>> dfsTree(TreeNode root) {Stack<TreeNode> nodeStack = new Stack<>();Stack<List<TreeNode>> pathStack = new Stack<>();List<List<TreeNode>> result = new ArrayList<>();nodeStack.push(root);ArrayList<TreeNode> arrayList = new ArrayList<>();arrayList.add(root);pathStack.push(arrayList);while (!nodeStack.isEmpty()) {TreeNode curNode = nodeStack.pop();List<TreeNode> curPath = pathStack.pop();if (curNode.children == null || curNode.children.size() <= 0) {result.add(curPath);} else {int childSize = curNode.children.size();for (int i = childSize - 1; i >= 0; i--) {TreeNode node = curNode.children.get(i);nodeStack.push(node);List<TreeNode> list = new ArrayList<>(curPath);list.add(node);pathStack.push(list);}}}return result;}

③ 广度优先遍历,遍历全部叶子路径

/*** 广度优先遍历 ---- 查找树的全部叶子路径* * @param root*            根节点* @return 叶子路径的集合*/public List<List<TreeNode>> bfsTree(TreeNode root) {Queue<TreeNode> nodeQueue = new LinkedList<>();Queue<List<TreeNode>> qstr = new LinkedList<>();List<List<TreeNode>> result = new ArrayList<>();nodeQueue.add(root);ArrayList<TreeNode> arrayList = new ArrayList<>();qstr.add(arrayList);while (!nodeQueue.isEmpty()) {TreeNode curNode = nodeQueue.remove();List<TreeNode> curList = qstr.remove();if (curNode.children == null || curNode.children.size() <= 0) {curList.add(curNode);result.add(curList);} else {for (int i = 0; i < curNode.children.size(); i++) {TreeNode treeNode = curNode.children.get(i);nodeQueue.add(treeNode);List<TreeNode> list = new ArrayList<>(curList);list.add(curNode);qstr.add(list);}}}return result;}

三种方式的输出:

深度优先遍历(递归):[[A, B, D], [A, B, E, I], [A, C, F], [A, C, H], [A, C, G]]
广度优先遍历:[[A, B, D], [A, C, F], [A, C, H], [A, C, G], [A, B, E, I]]
深度优先遍历(非递归):[[A, B, D], [A, B, E, I], [A, C, F], [A, C, H], [A, C, G]]

3、查找分支

示例是查找树的全部叶子节点,触类旁通,若是咱们是查找树中知足某个条件的路径,也是很是容易了。好比下面中查找 “ E ” 的分支:

public void recurTree(TreeNode root) {List<List<String>> result = new ArrayList<>();List<String> path = new ArrayList<>();path.add(root.value);findPath(result, root, path, "E");System.out.println(result);}private void findPath(List<List<String>> result, TreeNode node, List<String> path, String target) {if (target.equals(node.value)) {result.add(path);return;}if (node.children == null || node.children.size() <= 0) {return;}for (int i = 0; i < node.children.size(); i++) {TreeNode child = node.children.get(i);List<String> cPath = new ArrayList<>();cPath.addAll(path);cPath.add(child.value);if (result.size() > 0)break;findPath(result, child, cPath, target);}}

输出

[[A, B, E]]

JAVA 获取树的所有路径-深度优先遍历和广度优先相关推荐

  1. java 图的邻接矩阵表示,深度优先遍历,广度优先遍历

    转载:http://blog.csdn.net/yxmmao/article/details/51586540 1 . 创建图的邻接矩阵数据结构 public class MGraph {/*图的邻接 ...

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

    目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...

  3. 树与图的深度优先遍历

    树与图的深度优先遍历*: 树其实也是图的一种 图: 分为有向图和无向图 图的储存: 第一种:邻接矩阵,就是一个二维数组,缺点:当点和边特别多的时候,存不下,一般用的比较少,而且非常浪费空间 第二种:邻 ...

  4. java获取项目在磁盘路径

    java获取项目在磁盘路径 1.获取resource路径 String path = ClassUtils.getDefaultClassLoader().getResource("&quo ...

  5. Java获取静态资源文件路径

    Java获取静态资源文件路径 ​ 开发中经常会有文件相关的操作,比如说文件的查找,文件的存储.但是在使用中往往会因为路径问题耽误大量的开发时间.在实际中常常通过File file = new File ...

  6. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  7. 大话数据结构 17:图的深度优先遍历和广度优先遍历

    深度优先遍历 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底-,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点 ...

  8. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  9. 二叉树深度优先遍历和广度优先遍历

    二叉树深度优先遍历和广度优先遍历

最新文章

  1. python【力扣LeetCode算法题库】42-接雨水(双指针法)
  2. 创建新的swap文件
  3. android 右上角 xml,android状态栏右上角增加图标的方法
  4. hikari数据源配置类_spring-boot2项目默认hikari数据源的配置
  5. 系统集成项目管理案例答题技巧
  6. java除法运算符号怎么打_Java实用教程:运算符
  7. android代码设置drawable,Android:Textview 通过代码设置 Drawable
  8. 【结合文献】——Affymatrix芯片数据预处理
  9. 不离不弃共赴鸿蒙是什么歌,很早听过一首粤语歌,歌词好像是往往世界这么大 又可以遇到你 蛮经典的一首歌 求解答...
  10. metricbeat监控mysql_Metricbeat 参考指南(步骤1:安装Metricbeat)
  11. 个人博客网站添加文章搜索功能
  12. 目前常用的室内导航地图有哪些?什么软件可以室内导航?
  13. ps如何把自己的图与样机结合_如何利用PS制作贴图样机那
  14. 液晶显示器不宜使用屏幕保护程序
  15. 教师python培训心得体会
  16. android 文件编辑,文件编辑软件(在线文档编辑)
  17. VMware:在部分链上无法执行所调用的函数,请打开父虚拟磁
  18. unity材质球发光_Unity Lighting - Emissive Materials 自发光材质(九)
  19. SSM+阳光大学宿舍管理系统 毕业设计-附源码211714
  20. 机器学习之MATLAB代码--SMA_LSSVM(十一)

热门文章

  1. [ZT]武汉哪里的发廊最便宜?
  2. fullcalendar显示出勤日_FullCalendar日历插件使用说明
  3. API调用实现短信发送以及天气预报外加HTTP和MQTT实践操作
  4. 使用Adobe Flex 3开发大型多人在线游戏
  5. vue基础(主要为vue3)
  6. 购物网站毕业设计 (高配版)
  7. 上海信托面试20190820
  8. python 背景音乐程序代码_python背景音乐
  9. (11)求五百万内的亲和数
  10. 知识管理在业务中的价值如何体现