二叉树的建立与遍历
- 二叉树遍历分为三种方法:先序遍历,中序遍历,后序遍历
- 先序遍历:
- 访问根节点
- 遍历左子树
- 遍历右子树
- 遍历左子树
- 访问根节点
- 遍历右子树
- 遍历左子树
- 遍历右子树
- 访问根节点
#include<stdio.h>
#include<stdlib.h>
# define MAXSIZE 500
typedef struct Node
{
char data;
struct Node* lchild;
struct Node* rchild;
}BiTNode,*BiTree;
typedef struct
{
BiTNode data[MAXSIZE];
int top;
}SeqStack;
SeqStack* s;
typedef struct
{
BiTNode data[MAXSIZE];
int rear, front;
}CSeQueue;
CSeQueue* Q;
void CreatTree(BiTree *T);
void PostOrder(BiTree T);
void PreOrder(BiTree T);
void LevelOrder(BiTree T);
SeqStack* InitSeq();
void Push(SeqStack* s, BiTNode *c);
void Pop(SeqStack* s,BiTree *x);
int Empty(SeqStack* s);
CSeQueue* InitQueue();
int EmptySeQueue(CSeQueue* q);
void InSeQueue(CSeQueue* q, BiTNode* c);
void OutSeQueue(CSeQueue* q, BiTree* x);
void main()
{
BiTree root = NULL;
printf("Please input your data:");
CreatTree(&root);
printf("Postorder:");
PostOrder(root);
printf("\n");
printf("Preorder:");
PreOrder(root);
printf("\n");
printf("LevelOrder:");
LevelOrder(root);
printf("\n");
}
SeqStack* InitSeq()
{
s = (SeqStack*)malloc(sizeof(SeqStack));
s->top = -1;
return s;
}
CSeQueue* InitQueue()
{
Q = (CSeQueue*)malloc(sizeof(CSeQueue));
Q->front = Q->rear = MAXSIZE - 1;
return Q;
}
void InSeQueue(CSeQueue* q, BiTNode* c)
{
if ((q->rear + 1) % MAXSIZE == q->front)
{
printf("队满");
return;
}
else
{
q->rear = (q->rear + 1) % MAXSIZE;
q->data[q->rear] = *c;
}
}
void OutSeQueue(CSeQueue* q, BiTree* x)
{
if (EmptySeQueue(q) == 1)
{
printf("队空");
return;
}
else
{
q->front = (q->front + 1) % MAXSIZE;
*x = &q->data[q->front];
}
}
int Empty(SeqStack* s)
{
if (s->top == -1)
return 1;
else
return 0;
}
int EmptySeQueue(CSeQueue* q)
{
if (q->rear == q->front)
return 1;
else
return 0;
}
void Push(SeqStack* s, BiTNode *c)
{
if (s->top == MAXSIZE - 1)
{
return;
}
s->top++;
s->data[s->top] = *c;
}
void Pop(SeqStack* s,BiTree *x)
{
if (Empty(s))
{
return;
}
*x = &s->data[s->top];
s->top--;
}
void CreatTree(BiTree *T)
{
char s;
scanf("%c", &s);
if (s == '#')
{
*T = NULL;
}
else
{
*T = (BiTNode*)malloc(sizeof(BiTNode));
if (!(*T))
{
printf("申请空间失败\n");
}
(*T)->data = s;
CreatTree(&(*T)->lchild);
CreatTree(&(*T)->rchild);
}
}
void PostOrder(BiTree T)
{
if (T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c", T->data);
}
}
void PreOrder(BiTree T)
{
SeqStack* s = InitSeq();
BiTree p;
p = T;
while (p != NULL || !Empty(s))
{
if (p != NULL)
{
printf("%c", p->data);
Push(s, p);
p = p->lchild;
}
else
{
Pop(s, &p);
p = p->rchild;
}
}
}
void LevelOrder(BiTree T)
{
BiTree p;
Q = InitQueue();
InSeQueue(Q, T);
while (!EmptySeQueue(Q))
{
OutSeQueue(Q, &p);
printf("%c", p->data);
if (p->lchild != NULL)
{
InSeQueue(Q, p->lchild);
}
if (p->rchild != NULL)
{
InSeQueue(Q, p->rchild);
}
}
}