java二叉树深度优先遍历会考不递归的吗_树的广度优先遍历和深度优先遍历(递归非递归、Java实现)...
在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程。现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的)
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实现)...相关推荐
- java递归深度克隆_递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。...
手写递归方法 //定义检测数据类型的功能函数 function checkedType(target) { return Object.prototype.toString.call(target). ...
- 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!
构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...
- 消除左递归实验代码_「leetcode」669. 修剪二叉搜索树:【递归】【迭代】详解!
单纯移除一个节点那还不够,要修剪! ❞ 669. 修剪二叉搜索树 题目链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/ 给定 ...
- 二叉树的遍历(递归与非递归)
class Node: # 定义树节点def __init__(self, value, left=None, right=None): # 节点的值及左子树.右子树self.value = valu ...
- 二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度
文章目录 前言 创建二叉树 先序遍历 中序遍历 后序遍历 获取叶子节点个数 获取树的高度 测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基 ...
- 二叉树的非递归遍历(统一的模板)
二叉树的非递归遍历 前言 树的存储结构 先序遍历 先序的递归遍历 先序的非递归遍历 中序遍历 中序的递归遍历 中序遍历的非递归算法 后序遍历 后序的递归遍历 后序的非递归遍历 层次遍历 层次遍历获得每 ...
- 树:二叉树的非递归遍历算法
二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...
- 二叉树三种递归和非递归遍历 层序遍历
以下为二叉树的三种遍历(中序,先序,后序)源码,和非递归遍历源码. 中序 递归遍历 public static void inorderTraversal(TreeNode root) {if(ro ...
- 二叉树的遍历(非递归)
由于二叉树的递归方法实际上是系统在使用栈进行操作,因此我们的迭代(非递归)方法也就需要使用栈进行模拟. 一.先序遍历 我们需要明白,进栈的元素都是树的根节点 root. 所以我们需要先访问该节点,再将 ...
最新文章
- 暑期集训1:C++STL 练习题D:HDU-1509
- an初始java运行环境错误_【环境问题】STS(eclipse)启动出现错误提示:an error hava occured,see the log......
- vb中多个串口通讯_VB中的42个关键字,你知道都是哪些吗?
- 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)
- 我的狗丢了,所以我能加你微信吗? | 今日最佳
- 奥赛金牌计算机博士中学老师,博士教师从6人到27人 硕士教师从103人到190人 石室中学“十四五”规划立下十个flag...
- java调用word2vec模型_word2vec使用過程(Java版)
- 花呗将全面接入央行征信系统,拒绝接入将无法使用 网友:还好我不买房
- [Hadoop]SSH免密码登录以及失败解决方案
- python基础编程语法-Python编程入门——基础语法详解(经典)
- Collections 常用方法
- CodeCombat 落地马来西亚巴生中华小学,支持人工智能远程教学
- 3.IIC总线介绍及使用
- 什么是索引,索引的作用,什么时候需要使用索引,什么时候不需要使用索引
- matlab(slove)如何应用,README.md/matlab/slove at master · SeanXP/README.md · GitHub
- 购买的Microsoft Office不小心卸载后重新安装方法
- 72、公安网络视频监控系统解决方案
- MATLAB STK构建卫星轨道姿态控制仿真演示系统
- PLA,FPGA 简介
- css自动换行,css代码