算法概述
递归算法简洁明了、可读性好,但与非递归算法相比要消耗更多的时间和存储空间。为提高效率,我们可采用一种非递归的二叉树遍历算法。非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似。
对于中序遍历来说,非递归的算法比递归算法的效率要高的多。其中序遍历算法的实现的过程如下:
(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
分享到:
相关推荐
本资料“数据结构 二叉树三种遍历的非递归算法(背诵版)”着重介绍了二叉树的三种主要遍历方法——前序遍历、中序遍历和后序遍历的非递归实现。 **前序遍历**: 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。非...
vs2010下运行编写,使用了STL栈,实现了基本的插入、删除、计算深度、查找,主要是遍历,包括递归遍历,以及非递归的前序中序后序遍历,每个函数都有测试用例,如果存在错误,请在给我留言。
二叉树遍历是理解和操作二叉树的关键技能,通常包括三种主要的递归方法:前序遍历、中序遍历和后序遍历,以及一种非递归方法——层次遍历。本资源"遍历二叉树的4个非递归算法.rar"提供了C#语言实现的这四种非递归...
2.用递归及非递归算法对二叉树实现先序遍历; 3.用递归及非递归算法对二叉树实现中序遍历; 4.用递归及非递归算法对二叉树实现后序遍历。 5.用递归遍历算法中的访问结点的操作修改为叶结点计数,统计度为0的;度为1...
### 二叉树遍历的非递归算法分析与实现 #### 一、引言 在数据结构领域中,二叉树作为一种基本的数据组织形式,其应用极为广泛。对于二叉树的操作,其中最重要的就是遍历操作。遍历是指按照特定顺序访问二叉树的...
非递归实现同样利用栈,但需要在节点入栈后继续遍历其左子树,直到左子树为空,然后出栈并访问节点,转向右子树。 3. **后序遍历**:首先遍历左子树,然后遍历右子树,最后访问根节点。递归实现时,如果当前节点为...
本主题主要探讨的是在C++中如何实现二叉树的前序、中序和后序遍历,同时包括递归和非递归两种方法。VS2008是Microsoft Visual Studio的一个版本,它提供了一个强大的开发环境,支持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 || !...
2. **中序遍历**: 使用栈来完成非递归中序遍历二叉树的操作,按照先左子树、根节点、右子树的顺序访问节点。 3. **选择操作**: 程序提供选项供用户选择建立二叉树、执行中序遍历或退出程序。 文档提供的C语言程序...
`二叉树遍历.cpp`、`二叉树遍历终结版.cpp`、`二叉树遍历更简单.cpp` 这些文件可能是不同版本的C++代码实现,可能包含不同的算法优化或者改进,比如使用迭代而非递归,或者利用双端队列(deque)来简化后序遍历的...
探索二叉树遍历的奥秘,通过这篇资源你将了解二叉树遍历的基本概念...遍历方法:深入剖析三种经典遍历算法——前序遍历、中序遍历和后序遍历,包括递归和非递归实现。 代码示例:提供C的代码实例,帮助你掌握遍历技巧。
**课程设计报告——数据结构中的二叉树遍历演示** 在数据结构课程设计中,二叉树遍历是一项重要的实践任务。二叉树遍历主要包括前序遍历、中序遍历和后序遍历,这三种遍历方法在理解和应用二叉树时具有基础性的地位...
二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——(a); (2)只有一个根结点的二叉树——(b); (3)右子树为空的二叉树——(c); (4)左子树为空的二叉树——(d); (5)完全...
在本课程设计中,我们将探讨如何使用C++编程语言来构建和操作二叉树,特别是通过先序遍历建立二叉树以及非递归方式实现中序遍历。这一过程涉及到了数据结构中的核心概念——二叉链表,以及递归和非递归算法的应用。 ...
在Java中,二叉树的中序遍历可以通过递归和非递归两种方式实现。以下是两种方法的基本思路: ### 1. 递归法 递归法是最直观的方式,它通过调用自身函数来遍历左子树、访问根节点和右子树。代码如下: ```java ...
本压缩包提供的题解针对的是LeetCode第94题——二叉树的中序遍历,通过Python代码展示了递归和非递归两种解法。对于正在准备Python相关的求职面试者,深入理解并熟练应用这些解法将极大地提升面试表现和编程能力。
总结,本项目要求学生建立一棵二叉树,并使用递归算法实现先序、中序、后序遍历,同时选做内容要求实现非递归遍历。通过对输入的先序序列解析,可以构建出二叉树,再通过不同的遍历方式输出结果。通过这样的练习,...