java数据结构之二叉树遍历的非递归实现
算法概述
递归算法简洁明了、可读性好,但与非递归算法相比要消耗更多的时间和存储空间。为提高效率,我们可采用一种非递归的二叉树遍历算法。非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似。
对于中序遍历来说,非递归的算法比递归算法的效率要高的多。其中序遍历算法的实现的过程如下:
(1).初始化栈,根结点进栈;
(2).若栈非空,则栈顶结点的左孩子结点相继进栈,直到null(到叶子结点时)退栈;访问栈顶结点(执行visit操作)并使栈顶结点的右孩子结点进栈成为栈顶结点。
(3).重复执行(2),直至栈为空。
算法实现
package datastructure.tree;
import datastructure.stack.ArrayStack;
import datastructure.stack.Stack;
public class UnrecOrderBTree implements Visit{
private Stack stack = new ArrayStack();
private BTree bt;
@Override
public void visit(BTree btree) {
System.out.print("\t" + btree.getRootData());
}
public void inOrder(BTree boot) {
stack.clear();
stack.push(boot);
while(!stack.isEmpty()) {
//左孩子结点进栈
while((bt = ((BTree)(stack.peek())).getLeftChild()) != null) {
stack.push(bt);
}
//如果该结点没有右孩子,则逐级往上出栈
while(!stack.isEmpty() &&!( (BTree)stack.peek() ).hasRightTree()) {
bt = (BTree)stack.pop();
visit(bt);
}
//如果该结点有右孩子,则右孩子进栈
if(!stack.isEmpty() && ( (BTree)stack.peek() ).hasRightTree()){
bt = (BTree)stack.pop();
visit(bt);
stack.push(bt.getRightChild());
}
}
}
}
测试:

package datastructure.tree;
/**
* 测试二叉树
* @author Administrator
*
*/
public class BTreeTest {
public static void main(String args[]) {
BTree btree = new LinkBTree('A');
BTree bt1, bt2, bt3, bt4;
bt1 = new LinkBTree('B');
btree.addLeftTree(bt1);
bt2 = new LinkBTree('D');
bt1.addLeftTree(bt2);
bt3 = new LinkBTree('C');
btree.addRightTree(bt3);
bt4 = new LinkBTree('E');
bt3.addLeftTree(bt4);
bt4 = new LinkBTree('F');
bt3.addRightTree(bt4);
RecursionOrderBTree order = new RecursionOrderBTree();
System.out.println("\n中序遍历:");
order.inOrder(btree);
}
}
结果如下:
中序遍历:
D B A E
C F
转载至:http://blog.csdn.net/luoweifu/article/details/9079799
java数据结构之二叉树遍历的非递归实现的更多相关文章
- 二叉树遍历(非递归版)——python
二叉树的遍历分为广度优先遍历和深度优先遍历 广度优先遍历(breadth first traversal):又称层次遍历,从树的根节点(root)开始,从上到下从从左到右遍历整个树的节点. 深度优先遍 ...
- java数据结构之二叉树的定义和递归实现
定义最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树.递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称为左 ...
- c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- c/c++叉树的创建与遍历(非递归遍历左右中,不破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,不破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- java创建二叉树并实现非递归中序遍历二叉树
java创建二叉树并递归遍历二叉树前面已有讲解:http://www.cnblogs.com/lixiaolun/p/4658659.html. 在此基础上添加了非递归中序遍历二叉树: 二叉树类的代码 ...
- Java数据结构之二叉树的基本介绍与递归遍历
二叉树的基本概念: 正如我们所了解的,树是有很多中形态,但是我们规定,形如每个节点最多只能有两个子节点的一种形如称为二叉树.我们将二叉树中该节点的两个子节点分别称作为:左孩子节点和右孩子节点.该节点称 ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- C++版 - LeetCode 144. Binary Tree Preorder Traversal (二叉树先根序遍历,非递归)
144. Binary Tree Preorder Traversal Difficulty: Medium Given a binary tree, return the preorder trav ...
- python实现二叉树递归遍历与非递归遍历
一.中序遍历 前中后序三种遍历方法对于左右结点的遍历顺序都是一样的(先左后右),唯一不同的就是根节点的出现位置.对于中序遍历来说,根结点的遍历位置在中间. 所以中序遍历的顺序:左中右 1.1 递归实现 ...
随机推荐
- IntelliJ IDEA 2017版 springloaded实现热部署
1.配置pom.xml文档 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- Android的方法数超过65535问题
Under the Hood: Dalvik patch for Facebook for Android 先来看一段中文内容 Hack Dalvik VM解决Android 2.3 DEX/Line ...
- hdu 5018
http://acm.hdu.edu.cn/showproblem.php?pid=5018 任意给你三个数,让你判断第三个数是否在以前两个数为开头组成的Fibonacci 数列中. 直接暴力 #in ...
- 个人项目:实现wc.exe(Java)
本项目Github地址:https://github.com/NNewBoy/wc 项目相关要求 基本功能:(已实现) -c 统计文件字符数 -w 统计文件词的数目 -l 统计文件行数 扩展功能:(已 ...
- Sql Server 2008 压缩数据库日志文件
第一步:将数据库设置为简单模式 选中数据库点右键->属性: 第二步:收缩数日志文件 1, 2, 第三步:将恢复模式改回为完整模式 如果你觉得用UI界面麻烦,那你就用SQL语句吧 ...
- C# 使用ftp下载一个文件夹下的所有文件,包括子目录文件夹
这篇博客给大家补充一个方法,就是得到一个目录下的所有文件名称.在前端调用,大家写一个递归去遍历就可以了,我在这里就不在写了.具体ftp下载的方法在我的另一篇博客里有,需要的可以去看一下. /// &l ...
- svn 连接超时,连接失败解决办法
1.确认服务是否开启 2.Windows防火墙是否开启,如开启则关闭防火墙 3.安全软件是否将3306与443端口关闭. 关闭后无法连接
- UWP开发---通过委托跨页面导航
-前言 做过.Net开发的都了解,当二级窗口操作主窗口的控件时通常用委托的方式.那么在UWP开发中,常常会遇到MainPage的二级Frame里面的内容去操作MainPage的导航跳转,具体看下图: ...
- [USACO5.1] 乐曲主题Musical Themes
题目链接:戳我 Emmm......hash怎么做啊不会啊 这里是SA后缀数组版本的 就是先两两做差分,作为要处理后缀的数组.普通地求出来h数组之后,我们二分这个答案,然后判定是否合法就行了.是否合法 ...
- 975. Odd Even Jump
You are given an integer array A. From some starting index, you can make a series of jumps. The (1 ...