一 广度优先遍历(BFS)

//广度优先遍历二叉树,借助队列,queue
public static void bfs(TreeNode root){
Queue<TreeNode> queue = new LinkedList<TreeNode>(); //队列需要使用linkedlist来初始化
if(root == null)
return;
queue.add(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
System.out.print(node.val + " ");
if(node.left != null)
queue.add(node.left);
if(node.right != null)
queue.add(node.right);
}
}

二 深度优先遍历(DFS)

//深度优先遍历二叉树,借助堆栈,stack
public static void dfs(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>(); //借助stack
if(root == null)
return;
stack.push(root);
while(!stack.isEmpty()){ //若栈非空
TreeNode node = stack.pop();
System.out.print(node.val + " ");
if(node.right != null) //先将右孩子结点压入堆栈
stack.push(node.right);
if(node.left != null) //然后将左孩子结点压入堆栈
stack.push(node.left);
}
}

三、先序遍历非递归(preOrder)

/**
* 迭代(即深度优先遍历二叉树)
* 先序遍历二叉树
* @param root
* @return
*/
public static List<Object> preorderTraversal(TreeNode root) {
List<Object> list = new ArrayList<Object>();
if(root == null)
return list;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.add(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
list.add(node.val);
if(node.right != null) //先压入右子树
stack.push(node.right);
if(node.left != null) //再压入左子树
stack.push(node.left);
}
System.out.println(list);
return list;
}

四、中序遍历非递归(inOrder)

/**
* 迭代
* 中序遍历二叉树
* @param root
* @return
*/
public static List<Object> inorderTraversal(TreeNode root) {
List<Object> list = new ArrayList<Object>();
if(root == null)
return list;
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode p = root;
while(p != null || !s.isEmpty()){
while(p != null){
s.push(p);
p = p.left;
}
p = s.pop();
list.add(p.val);
p = p.right;
}
System.out.println(list);
return list;
}

五、后序遍历非递归(postOrder)

//后序非递归遍历二叉树
public static List<Object> postOrder(TreeNode root){
List<Object> list = new ArrayList<Object>();
if(root == null)
return list;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root, prev = root; //pre记录上一个已经输出的结点
while (node != null || stack.size() > 0) {
while (node != null) {
stack.push(node);
node = node.left;
}
TreeNode temp = stack.peek().right; //在出栈之前,先判断栈顶元素的右孩子结点
if (temp == null || temp == prev) { //当前节点无右子树或右子树已经输出
node = stack.pop();
list.add(node.val);
prev = node; //记录上一个已输出结点
node = null;
} else {
node = temp; //处理右子树
}
}
System.out.println(list);
return list;
}

BFS、DFS、先序、中序、后序遍历的非递归算法(java)的更多相关文章

  1. 前序 中序 后序 遍历 递归 非递归算法 java实现

    前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...

  2. 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

    public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...

  3. DS Tree 已知先序、中序 => 建树 => 求后序

    参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...

  4. TZOJ 3209 后序遍历(已知中序前序求后序)

    描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义:  ...

  5. [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)

    Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...

  6. [Java]算术表达式求值之一(中序表达式转后序表达式方案)

    第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...

  7. HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序 ...

  8. 分别求二叉树前、中、后序的第k个节点

    一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 ; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' ...

  9. HDU 1710 (二叉树的前序和中序,求后序)

    题目链接 题目大意: 输入二叉树的前序.中序遍历,请输出它的后序遍历 #include <stdio.h> #include <string.h> ; // 长度为n s1 前 ...

随机推荐

  1. SpringBoot 通过token进行身份验证,存储redis

    代码: public interface TokenManager { /** * 创建token * @param userInfo * @return */ String getToken(Use ...

  2. 深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO)

    深度学习课程笔记(十四)深度强化学习 ---  Proximal Policy Optimization (PPO) 2018-07-17 16:54:51  Reference: https://b ...

  3. (转载)windows下安装配置Xampp

    XAMPP是一款开源.免费的网络服务器软件,经过简单安装后,就可以在个人电脑上搭建服务器环境.本文为大家介绍Windows中安装XAMPP(Apache+Mysql+PHP)及使用方法及其相关问题的总 ...

  4. Unity3D学习笔记(三十六):Shader着色器(3)- 光照

    光照模型:用数学的方法模拟现实世界中的光照效果.   场景中模型身上的光反射到相机中的光线: 1.漫反射:产生明暗效果 2.高光反射:产生镜面反射,物体中有最亮且比较耀眼的一部分 3.自发光: 4.环 ...

  5. Selenium Webdriver 自动化测试开发常见问题(C#版)

    转一篇文章,有修改,出处http://www.7dtest.com/site/blog-2880-203.html 1:Selenium中对浏览器的操作 首先生成一个Web对象 IWebDriver ...

  6. JS中什么是发布--订阅模式?

    转载文章部分内容: 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. ...

  7. MySql连接时出现1251 client does no support authentic错误解决方法

    使用Navicat Premium软件连接时,报错: 解决方法: 修改配置项:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password B ...

  8. VC.【转】窗口置于前台并激活的方法

    1.VC 窗口置于前台并激活的方法 - CSDN博客.html https://blog.csdn.net/oXunFeng/article/details/52681279 2.(http://ww ...

  9. eclipse中启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误

    原因1:给定目录下jvm.dll不存在. 对策:(1)重新安装jre或者jdk并配置好环境变量.(2)copy一个jvm.dll放在该目录下. 原因2:eclipse的版本与jre或者jdk版本不一致 ...

  10. Qt5数据库

     对于习惯使用SQL语法的用户,QSqlQuery类提供了直接执行SQL语句并处理返回结果的方法.对于习惯使用较高层数据库接口避免使用SQL语句的用户,QSqlTableModel类和QSqlRela ...