博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树(2)——遍历的非递归实现
阅读量:6880 次
发布时间:2019-06-27

本文共 1726 字,大约阅读时间需要 5 分钟。

hot3.png

算法概述

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

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

(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

转载于:https://my.oschina.net/verynix/blog/365851

你可能感兴趣的文章
nginx配置用户认证
查看>>
一文带你认识Spring事务
查看>>
玩转大数据系列之三:数据报表与展示
查看>>
阿里云BaaS:降低区块链应用门槛,用技术构建商业互信
查看>>
《富爸爸巴比伦最富有的人》读书笔记3000字
查看>>
分享几个国外学习网站
查看>>
一文分析java基础面试题中易出错考点
查看>>
6月21日云栖精选夜读丨CCTV5手机客户端新媒体:让赛事集锦堪比电影大片
查看>>
$ is not defined错误分析及解决
查看>>
Qt之子类发送消息给父类
查看>>
redis哨兵模式
查看>>
深入源码分析-线程池的实现原理
查看>>
开箱即用(out-of-box)的Redis序列号生成器,不用再写任何代码,你值得拥有
查看>>
Java大牛呕心沥血经历——技术面试与HR谈薪资技巧
查看>>
Pycharm上Django的使用 Day12
查看>>
遇见一只黑猫,她说Python是个怪物
查看>>
spring 中Page< >遇到得小问题
查看>>
IT兄弟连 JavaWeb教程 JavaBean组件定义
查看>>
PowerDesigner 概念数据模型(CDM) 说明
查看>>
JQuery动态给table添加、删除行
查看>>