数据结构之树和二叉树---二叉树的遍历
2015-08-07 10:37
567 查看
问题:分别用递归和非递归方式实现二叉树的先序遍历,中序遍历,后序遍历及层序遍历
二叉树的基本操作见数据结构之树和二叉树---二叉树的基本操作
//递归方式实现先序遍历
void PreOrderTraverse(BiTree bt)
{
if(bt)
{
printf("%c ", bt->data);
PreOrderTraverse(bt->lchild);
PreOrderTraverse(bt->rchild);
}else
printf("0 ");
}
//递归方式实现中序遍历
void InOrderTraverse(BiTree bt)
{
if(bt)
{
InOrderTraverse(bt->lchild);
printf("%c ", bt->data);
InOrderTraverse(bt->rchild);
}else
printf("0 ");
}
//递归方式实现后序遍历
void PostOrderTraverse(BiTree bt)
{
if(bt)
{
PostOrderTraverse(bt->lchild);
PostOrderTraverse(bt->rchild);
printf("%c ", bt->data);
}else
printf("0 ");
}
//递归方式实现层序遍历
void LevelOrderTraverse(BiTree bt, LinkQueue *lq)
{
ElemType elem;
if(lq->front!=lq->rear)
{
DeQueue(lq, &elem);
if(elem!=NULL)
{
printf("%c ", elem->data);
EnQueue(lq, elem->lchild);
EnQueue(lq, elem->rchild);
}else
printf("0 ");
LevelOrderTraverse(bt, lq);
}
}
//非递归方式实现先序遍历
void PreOrderTraverse_N_Recur(BiTree bt)
{
ElemType stackElem;
MyStack *stack = InitStack();
PushStack(stack, bt);
while(stack->top!=stack->base)
{
PopStack(stack,&stackElem);
if(stackElem!=NULL)
{
printf("%c ", stackElem->data);
PushStack(stack,stackElem->rchild);
PushStack(stack, stackElem->lchild);
}else
printf("0 ");
}
}
//非递归方式中序遍历
void InOrderTraverse_N_Recur(BiTree bt)
{
ElemType stackElem;
MyStack *stack = InitStack();
PushStack(stack, bt);
while(stack->top!=stack->base)
{
while((stackElem=(*(stack->top-1))->lchild)!=NULL)
PushStack(stack, stackElem);
do
{
printf("0 ");
PopStack(stack, &stackElem);
printf("%c ", stackElem->data);
}while(!stackElem->rchild&&stack->top!=stack->base);
if(stackElem->rchild!=NULL)
PushStack(stack, stackElem->rchild);
else
printf("0 ");
}
}
//非递归方式后序遍历
void PostOrderTraverse_N_Recur(BiTree bt)
{
ElemType stackElem;
MyStack *stack = InitStack();
BiTNode *tbn;
PushStack(stack, bt);
while(stack->top!=stack->base)
{
while((stackElem=*(stack->top-1))->lchild!=NULL)
PushStack(stack, stackElem->lchild);
printf("0 ");
if(stackElem->rchild!=NULL)
PushStack(stack, stackElem->rchild);
else
{
printf("0 ");
PopStack(stack, &stackElem);
while (stack->top!=stack->base)
{
while((*(stack->top-1))->rchild==stackElem)
{
printf("%c ", stackElem->data);
PopStack(stack, &stackElem);
if (stack->top==stack->base)
{
printf("%c ", stackElem->data);
return ;
}
}
if((*(stack->top-1))->lchild==stackElem)
{
printf("%c ", stackElem->data);
if((*(stack->top-1))->rchild!=NULL)
{
PushStack(stack, (*(stack->top-1))->rchild);
break;
}
else
{
printf("0 ");
PopStack(stack, &stackElem);
}
}
}
}
}
return ;
}
//非递归方式实现层序遍历
void LevelOrderTraverse_N_Recur(BiTree bt)
{
ElemType elem;
LinkQueue *lq = InitQueue();
EnQueue(lq, bt);
while(lq->front!=lq->rear)
{
DeQueue(lq, &elem);
if(elem!=NULL)
{
printf("%c ", elem->data);
EnQueue(lq, elem->lchild);
EnQueue(lq, elem->rchild);
}else
printf("0 ");
}
}
二叉树的基本操作见数据结构之树和二叉树---二叉树的基本操作
//递归方式实现先序遍历
void PreOrderTraverse(BiTree bt)
{
if(bt)
{
printf("%c ", bt->data);
PreOrderTraverse(bt->lchild);
PreOrderTraverse(bt->rchild);
}else
printf("0 ");
}
//递归方式实现中序遍历
void InOrderTraverse(BiTree bt)
{
if(bt)
{
InOrderTraverse(bt->lchild);
printf("%c ", bt->data);
InOrderTraverse(bt->rchild);
}else
printf("0 ");
}
//递归方式实现后序遍历
void PostOrderTraverse(BiTree bt)
{
if(bt)
{
PostOrderTraverse(bt->lchild);
PostOrderTraverse(bt->rchild);
printf("%c ", bt->data);
}else
printf("0 ");
}
//递归方式实现层序遍历
void LevelOrderTraverse(BiTree bt, LinkQueue *lq)
{
ElemType elem;
if(lq->front!=lq->rear)
{
DeQueue(lq, &elem);
if(elem!=NULL)
{
printf("%c ", elem->data);
EnQueue(lq, elem->lchild);
EnQueue(lq, elem->rchild);
}else
printf("0 ");
LevelOrderTraverse(bt, lq);
}
}
//非递归方式实现先序遍历
void PreOrderTraverse_N_Recur(BiTree bt)
{
ElemType stackElem;
MyStack *stack = InitStack();
PushStack(stack, bt);
while(stack->top!=stack->base)
{
PopStack(stack,&stackElem);
if(stackElem!=NULL)
{
printf("%c ", stackElem->data);
PushStack(stack,stackElem->rchild);
PushStack(stack, stackElem->lchild);
}else
printf("0 ");
}
}
//非递归方式中序遍历
void InOrderTraverse_N_Recur(BiTree bt)
{
ElemType stackElem;
MyStack *stack = InitStack();
PushStack(stack, bt);
while(stack->top!=stack->base)
{
while((stackElem=(*(stack->top-1))->lchild)!=NULL)
PushStack(stack, stackElem);
do
{
printf("0 ");
PopStack(stack, &stackElem);
printf("%c ", stackElem->data);
}while(!stackElem->rchild&&stack->top!=stack->base);
if(stackElem->rchild!=NULL)
PushStack(stack, stackElem->rchild);
else
printf("0 ");
}
}
//非递归方式后序遍历
void PostOrderTraverse_N_Recur(BiTree bt)
{
ElemType stackElem;
MyStack *stack = InitStack();
BiTNode *tbn;
PushStack(stack, bt);
while(stack->top!=stack->base)
{
while((stackElem=*(stack->top-1))->lchild!=NULL)
PushStack(stack, stackElem->lchild);
printf("0 ");
if(stackElem->rchild!=NULL)
PushStack(stack, stackElem->rchild);
else
{
printf("0 ");
PopStack(stack, &stackElem);
while (stack->top!=stack->base)
{
while((*(stack->top-1))->rchild==stackElem)
{
printf("%c ", stackElem->data);
PopStack(stack, &stackElem);
if (stack->top==stack->base)
{
printf("%c ", stackElem->data);
return ;
}
}
if((*(stack->top-1))->lchild==stackElem)
{
printf("%c ", stackElem->data);
if((*(stack->top-1))->rchild!=NULL)
{
PushStack(stack, (*(stack->top-1))->rchild);
break;
}
else
{
printf("0 ");
PopStack(stack, &stackElem);
}
}
}
}
}
return ;
}
//非递归方式实现层序遍历
void LevelOrderTraverse_N_Recur(BiTree bt)
{
ElemType elem;
LinkQueue *lq = InitQueue();
EnQueue(lq, bt);
while(lq->front!=lq->rear)
{
DeQueue(lq, &elem);
if(elem!=NULL)
{
printf("%c ", elem->data);
EnQueue(lq, elem->lchild);
EnQueue(lq, elem->rchild);
}else
printf("0 ");
}
}
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#中的递归APS和CPS模式详解
- C#数据结构揭秘一
- C#中遍历Hashtable的4种方法
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- Erlang中遍历取出某个位置的最大值代码
- 数据结构之Treap详解
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- Python:打印某个路径下的所有文件