数据结构----二叉树遍历的非递归算法实现
来源:互联网 发布:网页菜单制作软件 编辑:程序博客网 时间:2024/05/16 14:40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 0;
#define ERROR -1
#define OVERFLOW -2
#define YES 1
#define NO 0
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef int Status;
typedef int TElemType;
//二叉树的顺序存储结构
#define MaxTreeSize 101
typedef TElemType BiTreeArr[MaxTreeSize];
BiTreeArr bt;
//二叉树的链式存储结构
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTreeLk;
typedef BiTreeLk SElemType;
//@@@@@@@@@@@@@@@@@@@
//栈的数据结构部分开始
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化栈
Status InitStack(SqStack &Stack)
{
Stack.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if(!Stack.base) exit(OVERFLOW);
Stack.top = Stack.base;
Stack.stacksize = STACK_INIT_SIZE;
return OK;
}
//得到栈顶元素
Status GetTop(SqStack &Stack,SElemType &e)
{
if(Stack.top==Stack.base)
return ERROR;
e = *(Stack.top-1);
return OK;
}
//压栈
Status Push(SqStack &Stack,SElemType e)
{
if(Stack.top-Stack.base>=Stack.stacksize)
{
Stack.base= (SElemType *)realloc(Stack.base, sizeof(SElemType)*(Stack.stacksize+STACK_INCREMENT));
if(!Stack.base) return ERROR;
Stack.top = Stack.base+Stack.stacksize;
Stack.stacksize += STACK_INCREMENT;
}
*Stack.top++ = e;
return OK;
}
//出栈
Status Pop(SqStack &Stack,SElemType &e)
{
if(Stack.top==Stack.base) return ERROR;
Stack.top--;
e = *Stack.top; return OK;
}
Status StackEmpty(SqStack &Stack)
{
if(Stack.base == Stack.top)
return YES;
return NO;
}
//栈的数据结构部分结束
//@@@@@@@@@@@@@@@@@@@@@@@@@@@
Status Visit(TElemType data)
{
if(&data==NULL)
{
return ERROR;
}
else
{
printf(" %d",data);
return OK;
}
}
//采用递归算法的先序、中序和后序遍历算法
//先序递归便利算法
Status PreOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild, Visit))
if (PreOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
//中序递归遍历算法
Status InOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(PreOrderTraverse(T->lchild, Visit))
if(Visit(T->data))
if (PreOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
//后序递归遍历算法
Status PostOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(PreOrderTraverse(T->lchild, Visit))
if (PreOrderTraverse(T->rchild, Visit))
if(Visit(T->data))
return OK;
return ERROR;
}
else
return OK;
}
//非递归的二叉树中序遍历算法
//大体的思路是保存在遍历树时走过的路径,节点弹出的顺序即为节点访问的顺序
Status InOrderTraverse1(BiTreeLk T,Status(*Visit)(TElemType e))
{
SqStack Stack;
BiTreeLk p;
InitStack(Stack); //初始化一个栈
Push(Stack,T); //将根节点压入栈中
while(!StackEmpty(Stack)) //满足栈不空的条件
{
while(GetTop(Stack,p)&&p) //获取栈的最上面的指针
Push(Stack,p->lchild); //向左走到尽头,将这条线路上的点都压入栈中
Pop(Stack,p); //弹出入栈的空指针
if(!StackEmpty(Stack)) //如果栈不为空
{
Pop(Stack,p); //弹出一个节点指针
if(
!Visit(p->data)) //访问这个节点
return ERROR;
Push(Stack,p->rchild); //将其右节点入栈
}
}
return OK;
}
//非递归的二叉树中序遍历算法
Status InOrderTraverse2(BiTreeLk T, Status (*Visit)(TElemType e))
{
SqStack Stack;
InitStack(Stack);
BiTreeLk p = T;
while(p||!StackEmpty(Stack))
{
if(p)
{
Push(Stack,p);
p = p->lchild;
}
else
{
Pop(Stack,p);
if(!Visit(p->data))
return ERROR;
p = p->rchild;
}
}
return OK;
}
Status CreateBitreeLk(BiTreeLk &T)
{
char ch=' ';
scanf("%c",ch);
if(ch==' ')
T = NULL;
else
{
if(!(T=(BiTreeLk)malloc(sizeof(BiTNode))))
return ERROR;
T->data = ch;
CreateBitreeLk(T->lchild);
CreateBitreeLk(T->rchild);
}
return OK;
}
int main()
{
//Todo functions is here
//test the data structure above using the sampes of " A B C @ @ D E @ g @ @ f @ @ @ "
//'@' denote the empty character
BiTreeLk T;
CreateBitreeLk(T);
InOrderTraverse1(T,Visit);
return 0;
}
#include <stdlib.h>
#include <string.h>
#define OK 0;
#define ERROR -1
#define OVERFLOW -2
#define YES 1
#define NO 0
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef int Status;
typedef int TElemType;
//二叉树的顺序存储结构
#define MaxTreeSize 101
typedef TElemType BiTreeArr[MaxTreeSize];
BiTreeArr bt;
//二叉树的链式存储结构
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTreeLk;
typedef BiTreeLk SElemType;
//@@@@@@@@@@@@@@@@@@@
//栈的数据结构部分开始
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化栈
Status InitStack(SqStack &Stack)
{
Stack.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if(!Stack.base) exit(OVERFLOW);
Stack.top = Stack.base;
Stack.stacksize = STACK_INIT_SIZE;
return OK;
}
//得到栈顶元素
Status GetTop(SqStack &Stack,SElemType &e)
{
if(Stack.top==Stack.base)
return ERROR;
e = *(Stack.top-1);
return OK;
}
//压栈
Status Push(SqStack &Stack,SElemType e)
{
if(Stack.top-Stack.base>=Stack.stacksize)
{
Stack.base= (SElemType *)realloc(Stack.base, sizeof(SElemType)*(Stack.stacksize+STACK_INCREMENT));
if(!Stack.base) return ERROR;
Stack.top = Stack.base+Stack.stacksize;
Stack.stacksize += STACK_INCREMENT;
}
*Stack.top++ = e;
return OK;
}
//出栈
Status Pop(SqStack &Stack,SElemType &e)
{
if(Stack.top==Stack.base) return ERROR;
Stack.top--;
e = *Stack.top; return OK;
}
Status StackEmpty(SqStack &Stack)
{
if(Stack.base == Stack.top)
return YES;
return NO;
}
//栈的数据结构部分结束
//@@@@@@@@@@@@@@@@@@@@@@@@@@@
Status Visit(TElemType data)
{
if(&data==NULL)
{
return ERROR;
}
else
{
printf(" %d",data);
return OK;
}
}
//采用递归算法的先序、中序和后序遍历算法
//先序递归便利算法
Status PreOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild, Visit))
if (PreOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
//中序递归遍历算法
Status InOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(PreOrderTraverse(T->lchild, Visit))
if(Visit(T->data))
if (PreOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
//后序递归遍历算法
Status PostOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(PreOrderTraverse(T->lchild, Visit))
if (PreOrderTraverse(T->rchild, Visit))
if(Visit(T->data))
return OK;
return ERROR;
}
else
return OK;
}
//非递归的二叉树中序遍历算法
//大体的思路是保存在遍历树时走过的路径,节点弹出的顺序即为节点访问的顺序
Status InOrderTraverse1(BiTreeLk T,Status(*Visit)(TElemType e))
{
SqStack Stack;
BiTreeLk p;
InitStack(Stack); //初始化一个栈
Push(Stack,T); //将根节点压入栈中
while(!StackEmpty(Stack)) //满足栈不空的条件
{
while(GetTop(Stack,p)&&p) //获取栈的最上面的指针
Push(Stack,p->lchild); //向左走到尽头,将这条线路上的点都压入栈中
Pop(Stack,p); //弹出入栈的空指针
if(!StackEmpty(Stack)) //如果栈不为空
{
Pop(Stack,p); //弹出一个节点指针
if(
!Visit(p->data)) //访问这个节点
return ERROR;
Push(Stack,p->rchild); //将其右节点入栈
}
}
return OK;
}
//非递归的二叉树中序遍历算法
Status InOrderTraverse2(BiTreeLk T, Status (*Visit)(TElemType e))
{
SqStack Stack;
InitStack(Stack);
BiTreeLk p = T;
while(p||!StackEmpty(Stack))
{
if(p)
{
Push(Stack,p);
p = p->lchild;
}
else
{
Pop(Stack,p);
if(!Visit(p->data))
return ERROR;
p = p->rchild;
}
}
return OK;
}
Status CreateBitreeLk(BiTreeLk &T)
{
char ch=' ';
scanf("%c",ch);
if(ch==' ')
T = NULL;
else
{
if(!(T=(BiTreeLk)malloc(sizeof(BiTNode))))
return ERROR;
T->data = ch;
CreateBitreeLk(T->lchild);
CreateBitreeLk(T->rchild);
}
return OK;
}
int main()
{
//Todo functions is here
//test the data structure above using the sampes of " A B C @ @ D E @ g @ @ f @ @ @ "
//'@' denote the empty character
BiTreeLk T;
CreateBitreeLk(T);
InOrderTraverse1(T,Visit);
return 0;
}
- 数据结构----二叉树遍历的非递归算法实现
- 数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
- <数据结构>二叉树的递归、非递归以及层次遍历算法C语言实现
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 数据结构--二叉树遍历非递归实现
- 二叉树的递归遍历与非递归算法实现
- 二叉树的递归遍历与非递归算法实现
- 《算法导论》二叉树遍历的递归&非递归实现
- 数据结构-----二叉树的中序遍历的非递归算法实现
- 数据结构 二叉树的非递归遍历
- 数据结构:二叉树的非递归遍历
- 二叉树的非递归遍历-数据结构
- 【数据结构与算法】二叉树递归与非递归遍历
- 二叉树遍历的非递归算法的实现
- 用C++实现的二叉树非递归遍历算法
- 二叉树遍历的非递归算法
- 遍历二叉树的非递归算法
- 遍历二叉树的非递归算法
- jQuery取td内元素
- 使用Ant进行ssh和scp操作
- Project Euler 50
- 关于UITableView,你知道多少
- Linux fork返回值
- 数据结构----二叉树遍历的非递归算法实现
- 关于ByteBuffer
- 【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)
- [C++]数据结构:算法分析之八皇后问题
- .NET中六个你必须知道的重要概念之装箱(boxing)和拆箱(unboxing)
- Spring事务-所有客户端代码
- hdu 2044 一只小蜜蜂
- SSH和dwr整合实现在同一个页面的增加修改时id不一致的问题
- udp通信简单实例