算法概述

递归算法简洁明了、可读性好,但与非递归算法相比要消耗更多的时间和存储空间。为提高效率,我们可采用一种非递归的二叉树遍历算法。非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似。

对于中序遍历来说,非递归的算法比递归算法的效率要高的多。其中序遍历算法的实现的过程如下:

(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数据结构之二叉树遍历的非递归实现相关推荐

  1. 漫谈二叉树遍历(非递归)

    ------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...

  2. 二叉树遍历的非递归实现

    作者:冯老师,华清远见嵌入式学院讲师. 一.递归的定义及特点 递归是指某个函数直接或间接的调用自身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出.递归问题的关 ...

  3. 二叉树遍历(非递归)

    文章目录 二叉树遍历非递归版本 前序遍历 中序遍历 后序遍历 层序遍历 层序遍历+map记录高度 二叉树遍历非递归版本 前序遍历 如果右侧不为空,则右侧进栈,随后是左侧进栈.因为栈是先进后出,所以实现 ...

  4. 二叉树遍历(非递归遍历)

    #include <iostream> #include <vector> #include <stack>using namespace std;//思路分析 / ...

  5. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...

    树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...

  6. 二叉树 2.0 -- 非递归遍历

    二叉树递归遍历存在的问题 如果我们的二叉树只有左子树,而且树的高度还很深的时候,这个时候递归调用遍历的时候,栈帧空间开辟的较大,很可能造成栈溢出.但是我们一个程序中,为堆分配的空间要比栈大的多,这个时 ...

  7. 【数据结构】--- 二叉树的递归遍历和非递归遍历【C语言实现】

    目录 1. 创建一颗二叉树 2.递归前序遍历二叉树 3.递归中序遍历二叉树 4.递归后序遍历二叉树 5. 测试递归打印二叉树代码 6. 非-递归前序遍历二叉树 7. 非-递归实现中序遍历二叉树 8.  ...

  8. 数据结构之二叉树(遍历、建立、深度)

    数据结构之二叉树(遍历.建立.深度) 1.二叉树的深度遍历 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树的所有结点,使得每个结点被访问一次且仅被访问一次. 对于二叉树的深度遍历,有前序遍历 ...

  9. 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...

    [关于封装的那些事] 缺失封装 目录 - 缺失封装 为什么不能缺失封装? 缺失封装潜在的原因 未意识到关注点会不断变化 混合关注点 幼稚的设计决策 示例分析一 示例分析二 总结 缺失封装 没有将实现变 ...

最新文章

  1. 面向汽车应用的硬件推理芯片
  2. 北航孙钰:昆虫目标检测技术
  3. Codeforces Round #486 (Div. 3)【完结】
  4. linux计算机硬件信息,计算机linux查看硬件信息命令.doc
  5. Go语言GO111MODULE设置
  6. SQL存储过程的导入导出
  7. linux——回射服务器
  8. seclists各种字典工具
  9. python websocket server模块_Python 3.5.2实现websocket服务端(四): WebSocketServer类实现...
  10. linux中类似append的命令,Linux技巧:介绍 tar 命令打包、压缩、和加解密的用法
  11. 软件测试技术之如何编写测试用例
  12. 网络安全等级保护的过程
  13. linux卸载exe文件怎么恢复,linux中误删除程序包恢复实例
  14. 面试问题如何预防xss攻击
  15. Practical GameMaker Projects 免积分下载
  16. 产品读书《创业36条军规》
  17. 视觉注意力的循环神经网络模型
  18. 基于Dlib模型实现驾驶员疲劳检测项目
  19. P2690 [USACO04NOV]Apple Catching G 题解
  20. 判断当前时间是否是春节或者除夕【转载修改】

热门文章

  1. android spinner保存对象,Android Spinner默认值问题
  2. Django:cmd虚拟环境及第一个project、Pycharm虚拟环境及第一个project、Not Found favicon.ico、Windows命令行创建虚拟环境、Django版本选择
  3. ubuntun系统mysql数据库同步_Ubuntu下MySQL主从同步配置步骤
  4. 网络编程BaseIO介绍
  5. centos7安装xterm_CentOS 7使用x-manager中Xstart工具报缺少xterm包错误
  6. php curl 发送checkbox,使用curl 提交表单(多维数组+文件)数据到服务器的有关问题...
  7. c语言学习-利用函数指针的方法,求任意给出两个整数的x和y的和、差。
  8. Leecode刷题热题HOT100(17)——电话号码的字母组合
  9. 入门——使用TensorFlow.js进行AI图像分类
  10. 使用基于JSON的实体在C#中缓存远程数据