java使用btree_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使用btree_java数据结构之二叉树遍历的非递归实现相关推荐
- 漫谈二叉树遍历(非递归)
------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...
- 二叉树遍历的非递归实现
作者:冯老师,华清远见嵌入式学院讲师. 一.递归的定义及特点 递归是指某个函数直接或间接的调用自身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出.递归问题的关 ...
- 二叉树遍历(非递归)
文章目录 二叉树遍历非递归版本 前序遍历 中序遍历 后序遍历 层序遍历 层序遍历+map记录高度 二叉树遍历非递归版本 前序遍历 如果右侧不为空,则右侧进栈,随后是左侧进栈.因为栈是先进后出,所以实现 ...
- 二叉树遍历(非递归遍历)
#include <iostream> #include <vector> #include <stack>using namespace std;//思路分析 / ...
- 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...
树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...
- 二叉树 2.0 -- 非递归遍历
二叉树递归遍历存在的问题 如果我们的二叉树只有左子树,而且树的高度还很深的时候,这个时候递归调用遍历的时候,栈帧空间开辟的较大,很可能造成栈溢出.但是我们一个程序中,为堆分配的空间要比栈大的多,这个时 ...
- 【数据结构】--- 二叉树的递归遍历和非递归遍历【C语言实现】
目录 1. 创建一颗二叉树 2.递归前序遍历二叉树 3.递归中序遍历二叉树 4.递归后序遍历二叉树 5. 测试递归打印二叉树代码 6. 非-递归前序遍历二叉树 7. 非-递归实现中序遍历二叉树 8. ...
- 数据结构之二叉树(遍历、建立、深度)
数据结构之二叉树(遍历.建立.深度) 1.二叉树的深度遍历 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树的所有结点,使得每个结点被访问一次且仅被访问一次. 对于二叉树的深度遍历,有前序遍历 ...
- 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...
[关于封装的那些事] 缺失封装 目录 - 缺失封装 为什么不能缺失封装? 缺失封装潜在的原因 未意识到关注点会不断变化 混合关注点 幼稚的设计决策 示例分析一 示例分析二 总结 缺失封装 没有将实现变 ...
最新文章
- 面向汽车应用的硬件推理芯片
- 北航孙钰:昆虫目标检测技术
- Codeforces Round #486 (Div. 3)【完结】
- linux计算机硬件信息,计算机linux查看硬件信息命令.doc
- Go语言GO111MODULE设置
- SQL存储过程的导入导出
- linux——回射服务器
- seclists各种字典工具
- python websocket server模块_Python 3.5.2实现websocket服务端(四): WebSocketServer类实现...
- linux中类似append的命令,Linux技巧:介绍 tar 命令打包、压缩、和加解密的用法
- 软件测试技术之如何编写测试用例
- 网络安全等级保护的过程
- linux卸载exe文件怎么恢复,linux中误删除程序包恢复实例
- 面试问题如何预防xss攻击
- Practical GameMaker Projects 免积分下载
- 产品读书《创业36条军规》
- 视觉注意力的循环神经网络模型
- 基于Dlib模型实现驾驶员疲劳检测项目
- P2690 [USACO04NOV]Apple Catching G 题解
- 判断当前时间是否是春节或者除夕【转载修改】
热门文章
- android spinner保存对象,Android Spinner默认值问题
- Django:cmd虚拟环境及第一个project、Pycharm虚拟环境及第一个project、Not Found favicon.ico、Windows命令行创建虚拟环境、Django版本选择
- ubuntun系统mysql数据库同步_Ubuntu下MySQL主从同步配置步骤
- 网络编程BaseIO介绍
- centos7安装xterm_CentOS 7使用x-manager中Xstart工具报缺少xterm包错误
- php curl 发送checkbox,使用curl 提交表单(多维数组+文件)数据到服务器的有关问题...
- c语言学习-利用函数指针的方法,求任意给出两个整数的x和y的和、差。
- Leecode刷题热题HOT100(17)——电话号码的字母组合
- 入门——使用TensorFlow.js进行AI图像分类
- 使用基于JSON的实体在C#中缓存远程数据