#include<stdio.h>
#include<malloc.h>
typedef struct binode{
char data;
struct binode *lchild;
struct binode *rchild;
}BiNode,*BiTree;
/****************************
*输入创建二叉树: abd##ef###c##
*其实输入按照先序顺序,#表示叶子节点
*****************************/
void create(BiTree t){
char ch=(char)getchar();
if(ch=='#'){
t->data='#';
t->lchild=NULL;
t->rchild=NULL;
}
else{
t->data=ch;
t->lchild=(BiTree)malloc(sizeof(BiNode));
create(t->lchild);
t->rchild=(BiTree)malloc(sizeof(BiNode));
create(t->rchild);
}
}
//先序遍历
void preTraverse(BiTree t){
BiTree p=t;
BiTree stack[20]; //使用栈来替代递归方法
int top=0;
while(top>=0){
while(p->data!='#'){
printf("%c ",p->data);
stack[top++]=p;
p=p->lchild;
}
if(top>0)
p=stack[--top]->rchild;
else
top=-1;
}
}
//中序遍历,和先序差不多
void midTraverse(BiTree t){
BiTree p=t;
BiTree stack[20];
int top=0;
while(top>=0){
while(p->data!='#'){
stack[top++]=p;
p=p->lchild;
}
if(top>0){
p=stack[--top];
printf("%c ",p->data);
p=p->rchild;
}else
top=-1;
}
}
//后序遍历,稍微复杂一点
void afeTraverse(BiTree t){
BiTree p=t,q=t;
BiTree stack[20];
int top=0;
while(top>=0){
while(p->data!='#'){
stack[top++]=p;
p=p->lchild;
}
if(q->rchild==p){
printf("%c ",q->data);
q->data='#'; //遍历完的节点直接做叶子标记
--top;
}
if(top>0){
p=stack[top-1];
q=p;
p=p->rchild;
}
}
}
//测试
int main(){
BiTree root=(BiTree)malloc(sizeof(BiNode));
create(root);
afeTraverse(root);
printf("\n");
return 1;
}
分享到:
相关推荐
非递归遍历二叉树是一种不依赖递归函数来访问树的所有节点的方法,它通常通过栈或队列等数据结构来实现。下面我们将详细探讨非递归遍历二叉树的先序、中序和后序策略。 先序遍历是二叉树遍历的一种方法,其顺序为:...
### 非递归遍历二叉树:C语言实现详解 #### 一、引言 在计算机科学中,二叉树是一种常见的数据结构,它由一个根节点以及最多两个子树构成,这两个子树各自又可以是二叉树。二叉树的遍历是其操作中最基本且频繁的...
二叉树的非递归遍历,使用C++实现二叉树的非递归遍历,对正在学习算法的同学应该挺有帮助的
非递归遍历二叉树是一种不依赖递归函数来访问树中所有节点的方法,这在处理大型或深度较大的树时特别有用,因为它避免了调用栈溢出的风险。 二叉树的主要遍历方法有三种:前序遍历、中序遍历和后序遍历。在递归方式...
先序非递归遍历二叉树: a b c 中序递归遍历二叉树: b a c 中序非递归遍历二叉树: b a c 后序递归遍历二叉树: b c a 后序非递归遍历二叉树: b c a 二叉树的深度是2 二叉树的结点个数是3 Press any key to ...
用先序的方式创建二叉树,“#”代表空,然后自动输出递归与非递归的先中后三种顺序遍历二叉树
递归遍历二叉树、c语言以及数据结构均要用到,我还会上传非递归的··
二叉树的递归遍历、非递归遍历和层次遍历
中根顺序递归建立二叉树,递归及非递归遍历二叉树。C++面向过程实现
java语言实现的二叉树的各种操作(包括递归与非递归遍历二叉树,求二叉树的高度,节点总数,叶子节点等)
更简单的非递归遍历二叉树的方法 思路非常简洁,多看多思考
非递归遍历二叉树的算法可以分为先序遍历和后序遍历两种。 非递归先序遍历算法 非递归先序遍历算法使用栈来存储节点,并使用while循环来遍历二叉树。算法的步骤如下: 1. 初始化栈为空,并将根节点设置为当前节点...
本实验报告将深入探讨二叉树的递归和非递归遍历方法,并附带源代码实现,旨在帮助读者理解这两种遍历策略及其应用场景。 一、二叉树遍历 二叉树遍历主要有三种方法:前序遍历、中序遍历和后序遍历。它们是遍历...
非递归遍历则需要更复杂的逻辑,但可以避免栈溢出问题,并在某些情况下提供更好的性能。 在`Tree.cpp`文件中,可能包含了上述各种遍历方法的C++实现。通过阅读和理解这些代码,你可以学习如何在实际编程中处理完全...
在IT领域,尤其是在数据结构与算法的学习中,中序遍历二叉树的非递归算法是一个关键且实用的知识点。通常,我们首先通过递归来实现二叉树的遍历,但递归方法可能因深度过大导致栈溢出,因此掌握非递归版本的遍历算法...
二种非递归实现 二叉树中序遍历: 递归实现 非递归实现 二叉树后序遍历: 递归实现 非递归实现 二叉树层次遍历 二叉树层次创建,创建方法遵循卡特兰数 http://write.blog.csdn.net/postedit/17380455
除了这三种基本的递归遍历方法外,还有对应的非递归遍历方法。本文将详细介绍这六种遍历二叉树的方法,并给出相应的代码实现。 #### 1. 先序遍历(递归) **定义**: - 访问根节点; - 递归地先序遍历左子树; - ...
标题"关于二叉树前序和后序的非递归遍历算法"指的是不使用递归函数来实现二叉树的前序和后序遍历。递归方法虽然直观,但在处理大型二叉树时可能会导致栈溢出,因此非递归方法是一个更优的选择。 **前序遍历**是...