【数据结构】 二叉树 非递归遍历
2014-03-17 18:48
232 查看
以下是我自己的一些写法,由于本人修行尚浅,因此代码难免有不当之处,如有发现,敬请指出,如有雷同纯属巧合。
整个的代码:
/* 先序遍历 * 思路: 先输出根 并一直寻找左子树,同时,若存在右子树,则右子树入栈。 * 找完所有的左子树之后,栈顶出栈,重复上述工作,一直到栈空为止。 * */ void PreOrderTraverse(PBiTree T) { if (T == NULL) { return; } Stack nStack = {0,}; while (NULL != T) { if (T->RChild != NULL) { nStack.BElem[nStack.top++] = T->RChild; } printf("%c ",T->elem); T = T->LChild; if (NULL == T && nStack.top != 0) { T = nStack.BElem[-- nStack.top]; } } }
/** 中序遍历 * 根 先入栈, * */ void InOrderTraverse(PBiTree T) { if (T == NULL) { return; } Stack nStack = {0,}; while (NULL != T) { while (NULL != T->LChild) { nStack.BElem[nStack.top++] = T; T = T->LChild; } printf("%c ",T->elem); T = T->RChild; while (NULL == T) { if (0 != nStack.top) { T = nStack.BElem[--nStack.top]; printf("%c ",T->elem); } else { break; } T = T->RChild; } } }
整个的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct BiTree
{
char elem;
struct BiTree * LChild;
struct BiTree * RChild;
} BiTree,*PBiTree;
typedef struct Stack
{
int top;
PBiTree BElem[MAX_SIZE];
} Stack;
PBiTree CreateBiTree();
void PreOrderTraverse(PBiTree T);
void InOrderTraverse(PBiTree T);
int main()
{
PBiTree Tree = CreateBiTree();
printf("\n先序遍历:\n");
PreOrderTraverse(Tree);
printf("\n中序遍历:\n");
InOrderTraverse(Tree);
return 0;
}
PBiTree CreateBiTree()
{
char data;
PBiTree T;
scanf("%c",&data);
if (data == '#')
{
T = NULL;
}
else
{
T = (PBiTree)malloc(sizeof(BiTree));
T->elem = data;
T->LChild = CreateBiTree();
T->RChild = CreateBiTree();
}
return T;
}
/* 先序遍历 * 思路: 先输出根 并一直寻找左子树,同时,若存在右子树,则右子树入栈。 * 找完所有的左子树之后,栈顶出栈,重复上述工作,一直到栈空为止。 * */ void PreOrderTraverse(PBiTree T) { if (T == NULL) { return; } Stack nStack = {0,}; while (NULL != T) { if (T->RChild != NULL) { nStack.BElem[nStack.top++] = T->RChild; } printf("%c ",T->elem); T = T->LChild; if (NULL == T && nStack.top != 0) { T = nStack.BElem[-- nStack.top]; } } }
/** 中序遍历
* 根 先入栈,
* */
void InOrderTraverse(PBiTree T)
{
if (T == NULL)
{
return;
}
Stack nStack = {0,};
while (NULL != T)
{
while (NULL != T->LChild)
{
nStack.BElem[nStack.top++] = T;
T = T->LChild;
}
printf("%c ",T->elem);
T = T->RChild;
while (NULL == T)
{
if (0 != nStack.top)
{
T = nStack.BElem[--nStack.top];
printf("%c ",T->elem);
}
else
{
break;
}
T = T->RChild;
}
}
}
相关文章推荐
- 数据结构--二叉树--中序递归遍历二叉树(链式结构)
- 数据结构--非递归遍历二叉树(利用辅助栈)
- 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 【数据结构】非递归遍历二叉树
- 数据结构--二叉树--中序非递归遍历二叉树(链式结构)
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
- 数据结构学习笔记-二叉树的前、中、后序遍历,递归、非递归方式
- 【数据结构】二叉树的递归与非递归创建和遍历
- 【数据结构】二叉树前中后序遍历、层序遍历(递归实现)
- 数据结构---二叉树的前序、中序、后序遍历的递归和非递归 实现(C++)
- 遍历二叉树(数据结构,递归)
- 数据结构:二叉树(前,中,后,层次)非递归遍历。
- 【数据结构】二叉树的递归遍历
- 数据结构-递归遍历二叉树
- 数据结构-二叉树的前序、中序、后序遍历的递归和非递归实现
- 【数据结构】二叉树的定义,递归遍历,非递归遍历,层次遍历,深度等
- [置顶] 数据结构——二叉树 前序、中序、后序、递归遍历和非递归遍历
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构二叉树的递归遍历
- 数据结构-非递归遍历二叉树