二叉樹的三種非遞迴遍歷
阿新 • • 發佈:2019-02-17
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXN 50
typedef struct TreeNode *BinTree;
struct TreeNode{
char Data;
BinTree Left;
BinTree Right;
};
typedef struct StackNode *Stack;
struct StackNode{
BinTree Data[MAXN];
int Top;
};
BinTree CreateTree(char Pre[], char In[], int Len)
{
BinTree T;
int i;
if(!Len)
return NULL;
T = malloc(sizeof(struct TreeNode));
T->Data = Pre[0];
for(i = 0; i < Len; i++)
if(In[i] == Pre[0])
break;
T->Left = CreateTree(Pre+1, In, i);
T->Right = CreateTree(Pre+i+1, In+i+1, Len-i-1);
return T;
}
void Push(BinTree item, Stack p)
{
if(p->Top == MAXN-1)
{
printf("The stack is full\n");
return ;
}
else{
p->Data[++(p->Top)] = item;
return;
}
}
BinTree Pop(Stack p)
{
if(p->Top == -1)
{
printf("The stack is empty\n");
return NULL;
}
else
return (p->Data[(p->Top)--]);
}
int IsEmpty(Stack S)
{
if(S->Top == -1)
return 1;
else
return 0;
}
void InOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
Push(T,S);
T = T->Left;
}
T = Pop(S);
printf("%c ", T->Data);
T = T->Right;
}
}
void PreOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
printf("%c ", T->Data);
Push(T,S);
T = T->Left;
}
T = Pop(S);
T = T->Right;
}
}
int main()
{
BinTree BT;
char Pre[MAXN], In[MAXN];
int n;
scanf("%d", &n);
scanf("%s%s", Pre, In);
BT = CreateTree(Pre, In, n);
InOrderTravel(BT);
printf("\n");
PreOrderTravel(BT);
return 0;
}
#include <stdlib.h>
#include <malloc.h>
#define MAXN 50
typedef struct TreeNode *BinTree;
struct TreeNode{
char Data;
BinTree Left;
BinTree Right;
};
typedef struct StackNode *Stack;
struct StackNode{
BinTree Data[MAXN];
int Top;
};
BinTree CreateTree(char Pre[], char In[], int Len)
{
BinTree T;
int i;
if(!Len)
return NULL;
T = malloc(sizeof(struct TreeNode));
T->Data = Pre[0];
for(i = 0; i < Len; i++)
if(In[i] == Pre[0])
break;
T->Left = CreateTree(Pre+1, In, i);
T->Right = CreateTree(Pre+i+1, In+i+1, Len-i-1);
return T;
}
void Push(BinTree item, Stack p)
{
if(p->Top == MAXN-1)
{
printf("The stack is full\n");
return ;
}
else{
p->Data[++(p->Top)] = item;
return;
}
}
BinTree Pop(Stack p)
{
if(p->Top == -1)
{
printf("The stack is empty\n");
return NULL;
}
else
return (p->Data[(p->Top)--]);
}
int IsEmpty(Stack S)
{
if(S->Top == -1)
return 1;
else
return 0;
}
void InOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
Push(T,S);
T = T->Left;
}
T = Pop(S);
printf("%c ", T->Data);
T = T->Right;
}
}
void PreOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
printf("%c ", T->Data);
Push(T,S);
T = T->Left;
}
T = Pop(S);
T = T->Right;
}
}
int main()
{
BinTree BT;
char Pre[MAXN], In[MAXN];
int n;
scanf("%d", &n);
scanf("%s%s", Pre, In);
BT = CreateTree(Pre, In, n);
InOrderTravel(BT);
printf("\n");
PreOrderTravel(BT);
return 0;
}