您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】 二叉树 非递归遍历

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;
}
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐