BFS、DFS、先序、中序、后序遍历的非递归算法(java)
一 广度优先遍历(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)的更多相关文章
- 前序 中序 后序 遍历 递归 非递归算法 java实现
前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...
- 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现
public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...
- DS Tree 已知先序、中序 => 建树 => 求后序
参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...
- TZOJ 3209 后序遍历(已知中序前序求后序)
描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义: ...
- [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...
- [Java]算术表达式求值之一(中序表达式转后序表达式方案)
第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...
- HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序 ...
- 分别求二叉树前、中、后序的第k个节点
一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 ; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' ...
- HDU 1710 (二叉树的前序和中序,求后序)
题目链接 题目大意: 输入二叉树的前序.中序遍历,请输出它的后序遍历 #include <stdio.h> #include <string.h> ; // 长度为n s1 前 ...
随机推荐
- ZJOI 2015 幻想乡战略游戏(动态点分治)
题意 https://loj.ac/problem/2135 思路 首先要明确一点,答案分布是有单调性的.什么意思呢?假设我们的答案在 \(u\) 节点,\((u,v)\) 之间有一条边且 \(u\) ...
- Yarn 的日志聚集功能配置使用
需要 hadoop 的安装目录/etc/hadoop/yarn-site.xml 中进行配置 配置内容 <property> <name>yarn.log-aggregati ...
- Luncene学习 第一天 《入门程序》
整个luncene 流程 下面贴出代码 package com.zuoyan.lucene.demo; import java.io.File; import org.apache.commons.i ...
- Java中常用的方法
枚举: 1:DemoEnum.valueOf(String str) 从枚举类中中找字符串,如果有则返回对应枚举值 2:DemoEnum.values() 获得枚举集合 3:DemoEnum.prop ...
- React native中的组建通知通信:
有这么一个需求,在B页面pop()回到A页面,需要A页面执行刷新,那么我们可以采用以下方法: 1:在A页面Push到B页面中,加上一个A页面中的刷新函数做为参数,然后在B页面中在pop()函数封装后通 ...
- 使用git上传项目到github的最基础命令
一.前言 把github作为自己项目托管的地方,实在是一个明智的选择.就算你不为自己项目考虑,你也要为你团队项目开发而学呀!可能有些初学者(比如我)会觉得git命令好多啊,又是各种术语,觉得好难上手. ...
- re模块与subprocess模块介绍
一:re模块 处理正则表达式的模块,正则表达式就是一些带有特殊含义的符号或者符号的组合. 作用:对字符串进行过滤,在一堆字符串中找到你所关心的内容,你就需要告诉计算机你的过滤的 规则是什么 ...
- Jenkins--Credentials添加证书从git上拉代码
直接上图:
- 分组查询以及having使用
Group by 注意事项:对查询的列有限制,除了聚合函数外,就必须是分组的项 order by总是放在最后 代码示例: select Gender as 性别 ,count (Gender) a ...
- .NET扩展方法 封装公用方法
定义方法的时候 第一个参数前面加上this 表示这个方法可以被IQueryable类型的对象.出来 调用的时候 只用传第二个参数 第一个参数不用传 第一个参数就是.出当前方法的参数 定义扩展 ...