Java 非递归实现 二叉树的前中后遍历以及层级遍历
class MyBinaryTree<T> {
BinaryNode<T> root;
public MyBinaryTree() {
root = new BinaryNode<>();
}
/**
* 堆栈进行先序遍历
*
* @param ts
*/
public void preorderTraversal(T... ts) {
Stack<BinaryNode<T>> binaryStack = new Stack<>();
BinaryNode<T> temp = root;
while (!binaryStack.isEmpty() || temp != null) {
if (temp != null) {
// 处理
System.out.println(temp.data);
// 先序
if (temp != null) {
binaryStack.push(temp);
}
temp = temp.left;
} else {
temp = binaryStack.pop();
temp = temp.right != null ? temp.right : null;
}
}
}
/**
* 堆栈中序遍历
*
* @param ts
*/
public void inorderTraversal(T... ts) {
Stack<BinaryNode<T>> binaryStack = new Stack<>();
BinaryNode<T> temp = root;
while (!binaryStack.isEmpty() || temp != null) {
if (temp != null) {
binaryStack.push(temp);
temp = temp.left;
} else {
temp = binaryStack.pop();
// 处理
System.out.println(temp.data);
temp = temp.right != null ? temp.right : null;
}
}
}
/**
* 堆栈后序遍历
*
* @param ts
*/
public void postorderTraversal(T... ts) {
Stack<BinaryNode<T>> binaryStack = new Stack<>();
BinaryNode<T> temp = root;
BinaryNode<T> node = null;
while (!binaryStack.isEmpty() || temp != null) {
if (temp != null) {
binaryStack.push(temp);
temp = temp.left;
} else {
temp = binaryStack.pop();
if (temp.right == null || temp.right == node) {
// 处理
System.out.println(temp.data);
node = temp;
temp = null;
} else {
binaryStack.push(temp);
temp = temp.right;
binaryStack.push(temp);
temp = temp.left;
}
}
}
}
/**
* 层级遍历
*/
public void levelTraversal() {
BinaryNode<T> temp = root;
Queue<BinaryNode<T>> queue = new LinkedList<>();
queue.add(temp);
while(!queue.isEmpty()) {
temp = queue.poll();
// 处理
System.out.println(temp.data);
if(temp.left!=null) {
queue.add(temp.left);
}
if(temp.right!=null) {
queue.add(temp.right);
}
}
}
}
class BinaryNode<T> {
BinaryNode<T> left;
T data;
BinaryNode<T> right;
public BinaryNode() {
}
public BinaryNode(BinaryNode<T> left, T data, BinaryNode<T> right) {
this.left = left;
this.data = data;
this.right = right;
}
}
测试代码:
private MyBinaryTree<String> binaryTree;
@Before
public void setUp() {
binaryTree = new MyBinaryTree<>();
binaryTree.root.data = "A";
binaryTree.root.left = new BinaryNode<>(new BinaryNode<>(null, "D", null), "B", null);
binaryTree.root.right = new BinaryNode<>(new BinaryNode<>(null, "F", null), "C",
new BinaryNode<>(null, "E", null));
}
@Test
public void preorderTest() {
binaryTree.preorderTraversal();
System.out.println("---------------先序遍历------------------");
}
@Test
public void inorderTest() {
binaryTree.inorderTraversal();
System.out.println("---------------中序遍历------------------");
}
@Test
public void postorderTest() {
binaryTree.postorderTraversal();
System.out.println("---------------后序遍历------------------");
}
@Test
public void levelTest() {
binaryTree.levelTraversal();
System.out.println("---------------层级遍历------------------");
}
Java 非递归实现 二叉树的前中后遍历以及层级遍历的更多相关文章
- Java非递归的方式获取目录中所有文件(包括目录)
零.思路解析 对于给出的文件查看其下面的所有目录,将这个目录下的所有目录放入待遍历的目录集合中,每次取出该集合中的目录遍历,如果是目录再次放入该目录中进行遍历. 一.代码 /** * 非递归的方式获取 ...
- Qt实现 动态化遍历二叉树(前中后层次遍历)
binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...
- java实现二叉树的前中后遍历(递归和非递归)
这里使用下图的二叉树作为例子: 首先建立树这个类: public class Node { private int data; private Node leftNode; private Node ...
- POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)
链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...
- Binary Tree Traversal 二叉树的前中后序遍历
[抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...
- 数据结构-C语言递归实现树的前中后序遍历
#include <stdio.h> #include <stdlib.h> typedef struct tree { int number ; struct tree *l ...
- 五二不休息,今天也学习,从JS执行栈角度图解递归以及二叉树的前、中、后遍历的底层差异
壹 ❀ 引 想必凡是接触过二叉树算法的同学,在刚上手那会,一定都经历过题目无从下手,甚至连题解都看不懂的痛苦.由于leetcode不方便调试,题目做错了也不知道错在哪里,最后无奈的cv答案后心里还不断 ...
- 二叉树前中后/层次遍历的递归与非递归形式(c++)
/* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...
- [C++] 非递归实现前中后序遍历二叉树
目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...
随机推荐
- mvc框架模式
首先分为3个板块 路由的api相当于一个域名. 根据当前地址在执行路由里的代码; 逻辑层: 书写业务逻辑的都代码都放在controller层 数据处理层: model 写数据的增删改查方法,导出一般供 ...
- 改变一下主要发博的方向吧...转scratch!
因为expression2实在是没什么好说的,BUI,水滴鱼大佬还有其他贴吧上的大佬,实在是多得不行,我一个小人物也说不了什么,然而scratch我却可以多发发脚本,思路,美工啊等等.所以以后我就主要 ...
- iTrash for Mac(卸载工具)破解版含注册机
iTrash for Mac是一款专为Mac用户打造非常好用的卸载工具,itrash mac版简单好用,只需要把需要卸载的程序的拖拽到iTrash Mac版窗口内就可以删除应用程序.现为大家带来itr ...
- Python Faker的使用(1):基础使用方法与函数速查,生成随机数据
在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据. 在手动制造数据的过程中,可能需要花费大量精力和工作量,现在好了,有一 ...
- Introducing Outflux: a smart way out of InfluxDB
转自:https://blog.timescale.com/migrate-outflux-a-smart-way-out-of-influxdb/ Migrate your workload fro ...
- sqlserver数据库不能重命名报错5030——我的一点小思考
在学习asp.net的时候使用mssql‘经常会出现这种错误,数据库不能重名名5030的错误,其实很简单原因就是有应用程序正在占用这个连接,使用这样一行命令就可以查询出正在占用的连接 use mast ...
- myEclipse+Spring boot+Hbuilder+jwt Token+mongoDB+企业微信H5开发
企业微信应用的H5开发 1.参考文档:weUI:http://jqweui.com/ 2.企业微信接口文档:https://work.weixin.qq.com/api/doc#10029 3.百度地 ...
- Python中第三方的用于解析HTML的库:BeautifulSoup
背景 在Python去写爬虫,网页解析等过程中,比如: 如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站 常常需要涉及到HTML等网页的解析. 当然,对于简单的HTML中内 ...
- cmd常用命令总结
1.cmd不同盘符之间切换 方法(1): cd /d 路径如:cd /d c:/windows 方法(2): d:2.cls 清空cmd窗口dir 查看文件夹下的目录md 创建文件夹rd 删除文件夹c ...
- django中form页面刷新后自动提交的解决方案
如果一个页面包含了form,同时这个form中的提交按钮是type=submit的input的时候,你刷新该页面,就会有弹窗提示是否重新提交表单,这个特性不胜其烦,常见解决方法有两个: 第一种是前端的 ...