#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 200
/* 定义二叉树节点类型 */
typedef struct node
{
char data;
struct node *lchild, *rchild;
}BTNode;
/* 函数声明 */
BTNode* CreatBitTree();
void PreOrder(BTNode*);
void InOrder(BTNode*);
void PostOrder(BTNode*);
/* 主函数 */
int main()
{
BTNode *root = NULL;
root = CreatBitTree();
PreOrder(root);
InOrder(root);
PostOrder(root);
system("pause");
return 0;
}
/* 递归前序建立二叉树 */
BTNode* CreatBitTree()
{
char ch;
BTNode *b;
scanf("%c", &ch);
/* 遇到空节点停止递归 */
if (ch == '#')
{
b = NULL;
}
else
{
b = (BTNode*) malloc(sizeof(BTNode));
/* 建立根节点 */
b->data = ch;
/* 递归先序建立左子树 */
b->lchild = CreatBitTree();
/* 递归先序建立右子树 */
b->rchild = CreatBitTree();
}
return b;
}
/* 非递归前序遍历二叉树 */
void PreOrder(BTNode* b)
{
BTNode *stack[MAXSIZE], *p;
int top = -1;
if (b != NULL)
{ /* 根节点入栈 */
top++;
stack[top] = b;
/* 栈不空时循环 */
while (top > -1)
{ /* 出栈并访问该节点 */
p = stack[top];
top--;
printf("%c ", p->data);
/* 右孩子入栈 */
if (p->rchild != NULL)
{
top++;
stack[top] = p->rchild;
}
/* 左孩子入栈 */
if (p->lchild != NULL)
{
top++;
stack[top] = p->lchild;
}
}
printf("/n");
}
}
/* 非递归中序遍历二叉树 */
void InOrder(BTNode* b)
{
BTNode *stack[MAXSIZE], *p;
int top = -1;
if (b != NULL)
{
p = b;
while (top > -1 || p != NULL)
{ /* 扫描p的所有左节点并入栈 */
while (p != NULL)
{
top++;
stack[top] = p;
p = p->lchild;
}
if (top > -1)
{ /* 出栈并访问该节点 */
p = stack[top];
top--;
printf("%c ", p->data);
/* 扫描p的右孩子 */
p = p->rchild;
}
}
printf("/n");
}
}
/* 非递归后序遍历二叉树 */
void PostOrder(BTNode* b)
{
BTNode *stack[MAXSIZE], *p;
int sign, top = -1;
if (b != NULL)
{
do
{
/* b所有左节点入栈 */
while (b != NULL)
{
top++;
stack[top] = b;
b = b->lchild;
}
/* p指向栈顶前一个已访问节点 */
p = NULL;
/* 置b为已访问 */
sign = 1;
while (top != -1 && sign)
{
/* 取出栈顶节点 */
b = stack[top];
/* 右孩子不存在或右孩子已访问则访问b */
if (b->rchild == p)
{
printf("%c ", b->data);
top--;
/* p指向被访问的节点 */
p = b;
}
else
{
/* b指向右孩子节点 */
b = b->rchild;
/* 置未访问标记 */
sign = 0;
}
}
}while (top != -1);
printf("/n");
}
}
二叉树的非递归遍历(c语言 链式储存)
最新推荐文章于 2023-04-01 14:22:01 发布