在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程。现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的)

1.广度优先遍历

英文缩写为BFS即Breadth FirstSearch。其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。对于上面的例子来说,广度优先遍历的 结果是:A,B,C,D,E,F,G,H,I(假设每层节点从左到右访问)。

先往队列中插入左节点,再插右节点,这样出队就是先左节点后右节点了。

广度优先遍历树,需要用到队列(Queue)来存储节点对象,队列的特点就是先进先出。例如,上面这颗树的访问如下:

首先将A节点插入队列中,队列中有元素(A);

将A节点弹出,同时将A节点的左、右节点依次插入队列,B在队首,C在队尾,(B,C),此时得到A节点;

继续弹出队首元素,即弹出B,并将B的左、右节点插入队列,C在队首,E在队尾(C,D,E),此时得到B节点;

继续弹出,即弹出C,并将C节点的左、中、右节点依次插入队列,(D,E,F,G,H),此时得到C节点;

将D弹出,此时D没有子节点,队列中元素为(E,F,G,H),得到D节点;

。。。以此类推。。

代码:这里以二叉树为例,遍历所有节点的值

/**

public class TreeNode {

int val = 0;

TreeNode left = null;

TreeNode right = null;

public TreeNode(int val) {

this.val = val;

}

}

*/

public class Solution {

public ArrayList PrintFromTopToBottom(TreeNode root) {

ArrayList lists=new ArrayList();

if(root==null)

return lists;

Queue queue=new LinkedList();

queue.offer(root);

while(!queue.isEmpty()){

TreeNode tree=queue.poll();

if(tree.left!=null)

queue.offer(tree.left);

if(tree.right!=null)

queue.offer(tree.right);

lists.add(tree.val);

}

return lists;

}

}

2、深度优先

英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。对于上面的例子来说深度优先遍历的结果就是:A,B,D,E,I,C,F,G,H.(假设先走子节点的的左侧)。

深度优先遍历各个节点,需要使用到栈(Stack)这种数据结构。stack的特点是是先进后出。整个遍历过程如下:

先往栈中压入右节点,再压左节点,这样出栈就是先左节点后右节点了。

首先将A节点压入栈中,stack(A);

将A节点弹出,同时将A的子节点C,B压入栈中,此时B在栈的顶部,stack(B,C);

将B节点弹出,同时将B的子节点E,D压入栈中,此时D在栈的顶部,stack(D,E,C);

将D节点弹出,没有子节点压入,此时E在栈的顶部,stack(E,C);

将E节点弹出,同时将E的子节点I压入,stack(I,C);

...依次往下,最终遍历完成。

代码:也是以二叉树为例。非递归

/**

public class TreeNode {

int val = 0;

TreeNode left = null;

TreeNode right = null;

public TreeNode(int val) {

this.val = val;

}

}

*/

public class Solution {

public ArrayList PrintFromTopToBottom(TreeNode root) {

ArrayList lists=new ArrayList();

if(root==null)

return lists;

Stack stack=new Stack();

stack.push(root);

while(!stack.isEmpty()){

TreeNode tree=stack.pop();

//先往栈中压入右节点,再压左节点,这样出栈就是先左节点后右节点了。

if(tree.right!=null)

stack.push(tree.right);

if(tree.left!=null)

stack.push(tree.left);

lists.add(tree.val);

}

return lists;

}

}

深度优先的递归实现:

public void depthOrderTraversalWithRecursive()

{

depthTraversal(root);

}

private void depthTraversal(TreeNode tn)

{

if (tn!=null)

{

System.out.print(tn.value+" ");

depthTraversal(tn.left);

depthTraversal(tn.right);

}

}

本文大量引用自:http://www..com/toSeeMyDream/p/5816682.html

java二叉树深度优先遍历会考不递归的吗_树的广度优先遍历和深度优先遍历(递归非递归、Java实现)...相关推荐

  1. java递归深度克隆_递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。...

    手写递归方法 //定义检测数据类型的功能函数 function checkedType(target) { return Object.prototype.toString.call(target). ...

  2. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!

    构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...

  3. 消除左递归实验代码_「leetcode」669. 修剪二叉搜索树:【递归】【迭代】详解!

    单纯移除一个节点那还不够,要修剪! ❞ 669. 修剪二叉搜索树 题目链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/ 给定 ...

  4. 二叉树的遍历(递归与非递归)

    class Node: # 定义树节点def __init__(self, value, left=None, right=None): # 节点的值及左子树.右子树self.value = valu ...

  5. 二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度

    文章目录 前言 创建二叉树 先序遍历 中序遍历 后序遍历 获取叶子节点个数 获取树的高度 测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基 ...

  6. 二叉树的非递归遍历(统一的模板)

    二叉树的非递归遍历 前言 树的存储结构 先序遍历 先序的递归遍历 先序的非递归遍历 中序遍历 中序的递归遍历 中序遍历的非递归算法 后序遍历 后序的递归遍历 后序的非递归遍历 层次遍历 层次遍历获得每 ...

  7. 树:二叉树的非递归遍历算法

    二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...

  8. 二叉树三种递归和非递归遍历 层序遍历

    以下为二叉树的三种遍历(中序,先序,后序)源码,和非递归遍历源码.  中序 递归遍历 public static void inorderTraversal(TreeNode root) {if(ro ...

  9. 二叉树的遍历(非递归)

    由于二叉树的递归方法实际上是系统在使用栈进行操作,因此我们的迭代(非递归)方法也就需要使用栈进行模拟. 一.先序遍历 我们需要明白,进栈的元素都是树的根节点 root. 所以我们需要先访问该节点,再将 ...

最新文章

  1. 暑期集训1:C++STL 练习题D:HDU-1509
  2. an初始java运行环境错误_【环境问题】STS(eclipse)启动出现错误提示:an error hava occured,see the log......
  3. vb中多个串口通讯_VB中的42个关键字,你知道都是哪些吗?
  4. 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)
  5. 我的狗丢了,所以我能加你微信吗? | 今日最佳
  6. 奥赛金牌计算机博士中学老师,博士教师从6人到27人 硕士教师从103人到190人 石室中学“十四五”规划立下十个flag...
  7. java调用word2vec模型_word2vec使用過程(Java版)
  8. 花呗将全面接入央行征信系统,拒绝接入将无法使用 网友:还好我不买房
  9. [Hadoop]SSH免密码登录以及失败解决方案
  10. python基础编程语法-Python编程入门——基础语法详解(经典)
  11. Collections 常用方法
  12. CodeCombat 落地马来西亚巴生中华小学,支持人工智能远程教学
  13. 3.IIC总线介绍及使用
  14. 什么是索引,索引的作用,什么时候需要使用索引,什么时候不需要使用索引
  15. matlab(slove)如何应用,README.md/matlab/slove at master · SeanXP/README.md · GitHub
  16. 购买的Microsoft Office不小心卸载后重新安装方法
  17. 72、公安网络视频监控系统解决方案
  18. MATLAB STK构建卫星轨道姿态控制仿真演示系统
  19. PLA,FPGA 简介
  20. css自动换行,css代码

热门文章

  1. 博学谷html css,博学谷 - CSS笔记12 - 清除浮动
  2. ELF文件的签名与验证
  3. MySQL高阶面试题
  4. c/c++处理命令行参数int argc, char **argv的方法
  5. python 输入华氏温度f_如何用 python编写华氏摄氏度的相互转换?
  6. VUE3组合api的钩子函数生命周期
  7. python的基础 杂项(十四)
  8. Docker实践(七)部署SpringBoot微服务
  9. Docker简单实践(一)
  10. 在MySQL中使用游标和for循环