说到数的遍历树,长期以来的第一印象都是通过递归去实现。然而今天看了某位前辈的代码,才发现使用栈去实现遍历是那么简单。理论上通过数组也是可以实现同等功能的,毕竟Stack也是通过数据去实现的。

package com.sysway.ui.widget;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;public class Traversal {/*** 通过栈实现对根节点下所有叶节点的遍历* @param root 根节点* @return 叶节点集合*/private static List<TreeNode> traversalByStack(TreeNode root) {List<TreeNode> results = new ArrayList<TreeNode>();Stack<TreeNode> stack = new Stack<TreeNode>();stack.push(root); // 将元素推入栈中while (!stack.isEmpty()) {TreeNode node = stack.pop(); // 取出栈顶元素,并将该元素从栈中删除if (node.isLeaf()) { // 如果是叶节点results.add(node);}else {List<TreeNode> childrens = node.getChildrens(); // 取非叶节点的所有子节点stack.addAll(childrens); // 将所有子节点加入栈}}return results;}/*** 通过递归实现对根节点下所有叶节点的遍历* @param root 根节点* @return 叶节点集合*/private static List<TreeNode> traversalByRecursion(TreeNode node) {List<TreeNode> results = new ArrayList<TreeNode>();if (node.isLeaf()) {results.add(node);}else {for (TreeNode children : node.getChildrens()) {results.addAll(traversalByRecursion(children));}}return results;}public static void main(String[] args) {TreeNode node1 = new TreeNode("1");TreeNode node2 = new TreeNode("2");TreeNode node3 = new TreeNode("3");TreeNode node4 = new TreeNode("4");TreeNode node5 = new TreeNode("5");TreeNode node6 = new TreeNode("6");node1.addChildren(node2, node3);node2.addChildren(node4, node5);node5.addChildren(node6);List<TreeNode> leafs = traversalByStack(node1);System.out.println("---------Stack");for (TreeNode leaf : leafs) {System.out.println(leaf.getData());}List<TreeNode> leafs2 = traversalByRecursion(node1);System.out.println("---------Recursion");for (TreeNode leaf : leafs2) {System.out.println(leaf.getData());}}}class TreeNode {private List<TreeNode> childrens;private String data;public TreeNode(String data) {this.data = data;}public void addChildren(TreeNode... children) {if (children == null || children.length < 1) {return;}if (childrens == null) {childrens = new ArrayList<TreeNode>();}childrens.addAll(Arrays.asList(children));}public List<TreeNode> getChildrens() {return childrens;}public String getData() {return data;}public boolean isLeaf() {return childrens == null || childrens.isEmpty();}
}

树的结构如图:

输出结果如下:

---------Stack
3
6
4
---------Recursion
4
6
3

特别鸣谢yanan!

通过栈(Stack)实现对树的遍历相关推荐

  1. LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历--递归,迭代--反向压栈--C++解法

    LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历–递归,迭代–反向压栈–C++解法 LeetCode题解专栏:LeetCode题解 LeetC ...

  2. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  3. 数据结构之栈的应用:树的层次遍历、图的广度优先遍历、OS的FCFS策略

    栈的应用:树的层次遍历.图的广度优先遍历.OS的FCFS策略 树的层次遍历: 图的广度优先遍历 OS的FCFS策略: 树的层次遍历: 算法思想: 1.先遍历头节点1,头节点1入队 2.在遍历头节点的孩 ...

  4. DSt:数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【贪心/分治/动态规划】之详细攻略

    DSt:数据结构的简介.最强学习路线(逻辑结构[数组-链表-栈和队列/树-图-哈希].物理结构[元素/关系].数据运算[十大排序/四大查找-图三大搜索-树三大遍历].高级算法[贪心/分治/动态规划]) ...

  5. 数据结构思维 第六章 树的遍历

    第六章 树的遍历 原文:Chapter 6 Tree traversal 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章将介绍一个 Web 搜索引擎,我们将在本书其余部分开 ...

  6. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...

    本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...

  7. tree traversal (树的遍历) - postorder traversal (后序遍历)

    tree traversal (树的遍历) - postorder traversal (后序遍历) 1. tree traversal - 树的遍历 二叉树的遍历 (traversing binar ...

  8. 树-树的遍历(先序、中序、后序)

    树的遍历 树的遍历方式主要分为四种,先序.中序.后序和层序,在这篇博客中我将仔细介绍一下树的这四种遍历方式. 先序遍历 先序遍历,也叫先根遍历.前序遍历,首先访问根结点然后遍历左子树,最后遍历右子树. ...

  9. python实现树的遍历

    二叉树的遍历是指按照某种顺序依次访问树中的所有节点一次. 四种遍历方式分别是:先序遍历.中序遍历.后序遍历.层序遍历.其中前三种属于深度优先遍历(DFS),后一种属于广度优先遍历(BFS). 首先声明 ...

  10. Python 树的遍历

    文章目录 二叉树的遍历 前序遍历 递归 迭代 - 栈 中序遍历 递归 迭代 - 栈 莫里斯遍历 后序遍历 递归 迭代 - 栈 层序遍历 BFS-广度优先搜索 - 队列 层序遍历-BFS N叉树的遍历 ...

最新文章

  1. 数据解析1:XML解析(3)
  2. Java虚拟机9:Java类加载机制
  3. 笔记本电脑键盘切换_全球首款折叠屏笔记本电脑ThinkPad X1 Fold:5G高速互联拥抱PC场景融合时代...
  4. 第一天 :学习node.js
  5. hdoj 2041 超级阶梯
  6. My new iMac 27
  7. 图像条纹检测 python_机器视觉系统应用之—玻璃表面缺陷检测
  8. ANDROID笔记:Activity之间的传值
  9. css3常用伪类选择器
  10. Python利用结巴模块统计《水浒传》词频
  11. egret 之序列帧动画MoveClip
  12. gxworks2使用指令手册_编程软件GX-Works2简单工程功能块篇操作手册三菱GX-Works2手册 - 广州凌控...
  13. GD32F303x U盘使用
  14. 激光雷达+imu_激光雷达——定位
  15. 看懂财务报表一资产负债表
  16. Android 播放器之流媒体,边下边播如此简单。
  17. sFlow - 简介
  18. 为美女纹身--壁纸+视频生成器
  19. echarts实现水滴效果
  20. 无线ap死机无法联接服务器,无法连接无线接入点 这几步帮你轻松解决无线连接问题...

热门文章

  1. android播放flv,Android:从url播放flv视频流
  2. python导入pyecharts错误没有pyecharts_python报No module named 'pyecharts'的错误怎么办?
  3. Node的异步与java的异步_node.js和异步编程回文
  4. python支持向量机回归_Python中支持向量机SVM的使用方法详解
  5. 商品评价判别,文本分类——学习笔记
  6. HTML 文档流和文本流的理解
  7. python实现文件加密
  8. spring5.0.2中文官网文档pdf
  9. 20144303 20145239 实验三
  10. 从零开始攻略PHP(8)——面向对象(下)