import java.util.Stack;
/**
*
* @author ss
* 用栈完成二叉树的遍历
*/
public class Node {
//三个属性 值 左节点 右节点
private String value;
private Node nodeLeft;
private Node nodeRight;
public Node(String value){
this.value=value;
}
private static void showValue(String value){
System.out.println(value);
}
/**
* 构造二叉树
* @return
*/
private static Node init(){
Node node1=new Node("A");
Node node2=new Node("B");
Node node3=new Node("C");
Node node4=new Node("D");
Node node5=new Node("E");
Node node6=new Node("F");
Node node7=new Node("G");
node1.nodeLeft=node2;
node1.nodeRight=node3;
node2.nodeLeft=node4;
node2.nodeRight=node5;
node3.nodeLeft=node6;
node3.nodeRight=node7;
//返回根节点
return node1;
}
/**
* 前序遍历二叉树
* @param node
*/
public static void iteratorPreNodeTree(Node node){
Stack<Node> stack=new Stack<Node>();
if(node!=null){
stack.push(node);
while(!stack.empty()){
node=stack.pop();
showValue(node.value);
if(node.nodeRight!=null){
stack.push(node.nodeRight);
}
if(node.nodeLeft!=null){
stack.push(node.nodeLeft);
}
}
}
}
/**
* 中序遍历二叉树
* @param args
*/
public static void iterarorMidNodeTree(Node node){
Stack<Node> stack=new Stack<Node>();
while(node!=null){
while(node!=null){
if(node.nodeRight!=null){
stack.push(node.nodeRight);//将右节点压入栈
}
stack.push(node);//将当前节点压入栈
node=node.nodeLeft;
}
node=stack.pop();
while(!stack.empty()&&node.nodeRight==null){
showValue(node.value);
node=stack.pop();//取出左节点之后取出根节点
}
showValue(node.value);
if(!stack.empty()){
node=stack.pop();
}else{
node=null;
}
}
}
/**
* 后序遍历二叉树
* @param node
*/
public static void iteratorPostNodeTree(Node node){
//定义标记node 记录上一个节点
Node tempNode=node;
Stack<Node> stack=new Stack<Node>();
while(node!=null){
//左节点入栈
for(;node.nodeLeft!=null;node=node.nodeLeft){
stack.push(node);
}
//当前节点无右子 或者右子已经输出
while(node!=null&&(node.nodeRight==null||node.nodeRight==tempNode)){
showValue(node.value);
tempNode=node;
if(stack.empty()){
return;
}
node=stack.pop();
}
//处理右子
stack.push(node);
node=node.nodeRight;
}
}
//单元测试
public static void main(String[] args) {
Node root=init();
System.out.println("前序遍历二叉树");
iteratorPreNodeTree(root);
System.out.println("中序遍历二叉树");
iterarorMidNodeTree(root);
System.out.println("后序遍历二叉树");
iteratorPostNodeTree(root);
}
}
分享到:
相关推荐
总结来说,非递归后序遍历二叉树是通过模拟递归过程,利用栈进行数据的临时存储,以达到遍历的目的。这种方式不仅可以避免递归带来的栈溢出问题,而且在理解和实现上都有一定的挑战性,有助于提升编程技巧。在实际...
为了避免递归带来的额外开销,可以使用栈来实现非递归后序遍历。基本思想是模拟递归调用栈。首先,遍历所有节点并按顺序压入栈,同时记录已访问过的节点。当遇到一个没有被访问过的节点时,将其右子节点和左子节点...
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
### 二叉树先序、中序、后序遍历非递归算法 #### 前言 在计算机科学中,二叉树是一种常见的数据结构,它被广泛应用于各种算法和程序设计中。二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:...
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
在“二叉树的前中后序遍历(没有错误)”这个C语言实现的文件中,应该包含了三种遍历方式的代码实现,通过分析这些代码,我们可以理解每种遍历方法的逻辑和步骤。 **资源占用**: 虽然描述中提到“没有考虑系统的...
这是数据结构中二叉树的后序遍历的非递归算法的源代码。
实现非递归后序遍历较为复杂,通常需要两个栈或者一个带有标记的数据结构来辅助实现。这里采用的是一个带有标记的数据结构,用于区分当前节点是否已经被访问过。 #### 2. 代码实现 ```c #define maxsize 100 ...
不用栈 非递归后序遍历二叉树 有mark标志
在后序遍历中,访问顺序是先左子树,然后右子树,最后是根节点。 3. 树的遍历:报告中提到了后序遍历。二叉树的遍历有三种基本方式:先序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。在这里,...
非递归后序遍历二叉树: 非递归中序遍历二叉树(算法2): 层次遍历二叉树: 递归计算单分支结点: 递归计算双分支结点: 递归计算叶子数: 二叉数的深度: 交换二叉树的左右子树: 二叉树已左右交换。 ...
下面是后序遍历非递归算法的实现代码: ```c void PostOrderUnrec(Bitree t){ SqStack s; stacknode x; StackInit(s); p=t; do { while (p!=null){ x.ptr = p; x.tag = L; push(s,x); p=p->lchild; } ...
总结来说,非递归遍历二叉树是通过栈这一数据结构来控制遍历顺序,避免了递归调用带来的开销。这种方法需要对栈操作有深入理解,并且能够巧妙地设计算法逻辑以确保正确执行先序、中序和后序遍历。在实际编程中,这种...
非递归实现二叉树的先、中、后序遍历 typedef struct binarytree /*定义一棵二叉树*/ { char data; struct binarytree *LChild,*RChild; }BiTNode,*BiTree;
用非递归后序遍历二叉树的方式实现的表达式计算,进行了精细的表达式逻辑判断和处理,可进行加减乘除、括号、小数的计算。项目结构清晰,基本都有代码注释,可用于数据结构实验。同为学习人,能力有限,不足之处还请...
二叉树 非递归前中后序遍历汇总 C语言 希望大家给予建议
标题"关于二叉树前序和后序的非递归遍历算法"指的是不使用递归函数来实现二叉树的前序和后序遍历。递归方法虽然直观,但在处理大型二叉树时可能会导致栈溢出,因此非递归方法是一个更优的选择。 **前序遍历**是...
这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -> 左子树 -> 右子树 **中序遍历**:左子树 -> 根节点 -> 右子树 **后序遍历**:左子树 -> 右子...
本文将详细介绍二叉树的先序、中序和后序遍历,以及如何通过递归和非递归(迭代)的方式来实现这些遍历方法。 **先序遍历(Preorder Traversal)** 先序遍历的顺序是:根节点 -> 左子树 -> 右子树。递归实现时,...
二叉树后序遍历的非递归算法是指在遍历二叉树时,不使用递归函数,而是使用栈来存储结点的方法。该算法的主要思想是使用一个栈来存储结点,通过标志 flag 区分同一个结点的两次出栈。 在该算法中,首先将根指针 ...