`
luoweifu
  • 浏览: 62570 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

二叉树(2)——遍历的非递归实现

 
阅读更多


算法概述

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

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

(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 AE C F

分享到:
评论

相关推荐

    数据结构 二叉树三种遍历的非递归算法(背诵版).doc

    本资料“数据结构 二叉树三种遍历的非递归算法(背诵版)”着重介绍了二叉树的三种主要遍历方法——前序遍历、中序遍历和后序遍历的非递归实现。 **前序遍历**: 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。非...

    二叉树的遍历——递归以及非递归实现

    vs2010下运行编写,使用了STL栈,实现了基本的插入、删除、计算深度、查找,主要是遍历,包括递归遍历,以及非递归的前序中序后序遍历,每个函数都有测试用例,如果存在错误,请在给我留言。

    遍历二叉树的4个非递归算法.rar_binary tree_二叉树_二叉树 非递归 遍历_递归_遍历 CSharp

    二叉树遍历是理解和操作二叉树的关键技能,通常包括三种主要的递归方法:前序遍历、中序遍历和后序遍历,以及一种非递归方法——层次遍历。本资源"遍历二叉树的4个非递归算法.rar"提供了C#语言实现的这四种非递归...

    数据结构实验——二叉树的建立和遍历.zip

    2.用递归及非递归算法对二叉树实现先序遍历; 3.用递归及非递归算法对二叉树实现中序遍历; 4.用递归及非递归算法对二叉树实现后序遍历。 5.用递归遍历算法中的访问结点的操作修改为叶结点计数,统计度为0的;度为1...

    二叉树遍历的非递归算法分析与实现

    ### 二叉树遍历的非递归算法分析与实现 #### 一、引言 在数据结构领域中,二叉树作为一种基本的数据组织形式,其应用极为广泛。对于二叉树的操作,其中最重要的就是遍历操作。遍历是指按照特定顺序访问二叉树的...

    c++实现二叉树的4种遍历(递归和非递归)(csdn)————程序.pdf

    非递归实现同样利用栈,但需要在节点入栈后继续遍历其左子树,直到左子树为空,然后出栈并访问节点,转向右子树。 3. **后序遍历**:首先遍历左子树,然后遍历右子树,最后访问根节点。递归实现时,如果当前节点为...

    c++编写二叉树遍历(前中后序——递归与非递归)

    本主题主要探讨的是在C++中如何实现二叉树的前序、中序和后序遍历,同时包括递归和非递归两种方法。VS2008是Microsoft Visual Studio的一个版本,它提供了一个强大的开发环境,支持C++编程。 **前序遍历**: 前序...

    二叉树遍历递归与非递归(C语言版)

    在给定的文件中,`BiTreeTraverse.h`可能包含了遍历函数的声明,`Queue.h`可能提供了队列结构用于非递归遍历的实现,`BiTree.h`包含了二叉树节点的定义,`SeqStack.h`提供了顺序栈的定义,而`二叉树.cpp`则包含了...

    遍历二叉树的非递归实现

    ### 遍历二叉树的非递归实现 #### 一、引言 二叉树作为一种常见的数据结构,在计算机科学领域中占有极其重要的地位。无论是理论研究还是实际应用,二叉树都有着广泛的应用场景。例如,二叉搜索树用于快速查找、...

    栈的应用——二叉树的前序、中序、后序非递归遍历算法

    ### 前序遍历非递归算法 前序遍历的顺序为“根-左-右”。非递归实现主要依赖于栈来模拟递归过程: ```c void PreOrderUnrec(Bitree *t) { Stack s; StackInit(s); Bitree *p = t; while (p != NULL || !...

    实用《数据结构》编程——二叉树的建立、中序遍历非递归C程序.pdf

    2. **中序遍历**: 使用栈来完成非递归中序遍历二叉树的操作,按照先左子树、根节点、右子树的顺序访问节点。 3. **选择操作**: 程序提供选项供用户选择建立二叉树、执行中序遍历或退出程序。 文档提供的C语言程序...

    二叉树遍历——前中后序

    `二叉树遍历.cpp`、`二叉树遍历终结版.cpp`、`二叉树遍历更简单.cpp` 这些文件可能是不同版本的C++代码实现,可能包含不同的算法优化或者改进,比如使用迭代而非递归,或者利用双端队列(deque)来简化后序遍历的...

    探秘二叉树:揭开遍历技巧的神秘面纱【数据结构与算法课程设计】

    探索二叉树遍历的奥秘,通过这篇资源你将了解二叉树遍历的基本概念...遍历方法:深入剖析三种经典遍历算法——前序遍历、中序遍历和后序遍历,包括递归和非递归实现。 代码示例:提供C的代码实例,帮助你掌握遍历技巧。

    课程设计报告数据结构二叉树遍历演示_二叉树中序遍历怎么看

    **课程设计报告——数据结构中的二叉树遍历演示** 在数据结构课程设计中,二叉树遍历是一项重要的实践任务。二叉树遍历主要包括前序遍历、中序遍历和后序遍历,这三种遍历方法在理解和应用二叉树时具有基础性的地位...

    二叉树的形成和三种非递归遍历

    二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——(a); (2)只有一个根结点的二叉树——(b); (3)右子树为空的二叉树——(c); (4)左子树为空的二叉树——(d); (5)完全...

    链表先序建立二叉树,得到中序后序输出,递归和非递归实现(C++代码加设计报告)

    在本课程设计中,我们将探讨如何使用C++编程语言来构建和操作二叉树,特别是通过先序遍历建立二叉树以及非递归方式实现中序遍历。这一过程涉及到了数据结构中的核心概念——二叉链表,以及递归和非递归算法的应用。 ...

    java-leetcode题解之第94题二叉树的中序遍历.zip

    在Java中,二叉树的中序遍历可以通过递归和非递归两种方式实现。以下是两种方法的基本思路: ### 1. 递归法 递归法是最直观的方式,它通过调用自身函数来遍历左子树、访问根节点和右子树。代码如下: ```java ...

    python-leetcode面试题解之第94题二叉树的中序遍历-题解.zip

    本压缩包提供的题解针对的是LeetCode第94题——二叉树的中序遍历,通过Python代码展示了递归和非递归两种解法。对于正在准备Python相关的求职面试者,深入理解并熟练应用这些解法将极大地提升面试表现和编程能力。

    数据结构综合课设二叉树的建立与遍历.docx

    总结,本项目要求学生建立一棵二叉树,并使用递归算法实现先序、中序、后序遍历,同时选做内容要求实现非递归遍历。通过对输入的先序序列解析,可以构建出二叉树,再通过不同的遍历方式输出结果。通过这样的练习,...

Global site tag (gtag.js) - Google Analytics