#include <stdio.h>
#include <stdlib.h>
typedef struct _tree
{
char data;
struct _tree *left;
struct _tree *right;
}tree;
typedef struct _stack
{
tree **data;
int top;
int len;
}stack;
void init(stack *s,int len)
{
s->len = len;
s->top = 0;
s->data = (tree*)malloc(sizeof(tree)*len);
}
int isempty(stack *s)
{
return s->top == 0;
}
int isfull(stack *s)
{
return s->top == s->len;
}
void push(stack *s,tree *t)
{
s->data[s->top++] = t;
}
tree *pop(stack *s)
{
return s->data[--s->top];
}
void preorder(tree *t) //先序遍历递归版本
{
if(t)
{
printf("%c ",t->data);
preorder(t->left);
preorder(t->right);
}
}
void midorder(tree *t) //中序遍历递归版本
{
if(t)
{
midorder(t->left);
printf("%c ",t->data);
midorder(t->right);
}
}
void lastorder(tree *t) //后序遍历递归版本
{
if(t)
{
lastorder(t->left);
lastorder(t->right);
printf("%c ",t->data);
}
}
void preorder_other(tree *t) //先序遍历压栈出栈版本
{
if(t)
{
stack s;
init(&s,100);
while(t || !isempty(&s))
{
while(t)
{
printf("%c ",t->data);
push(&s,t);
t = t->left;
}
t = pop(&s);
t = t->right;
}
}
}
void midorder_other(tree *t) //中序遍历压栈出栈版本
{
if(t)
{
stack s;
init(&s,100);
while(t || !isempty(&s))
{
while(t)
{
push(&s,t);
t = t->left;
}
t = pop(&s);
printf("%c ",t->data);
t = t->right;
}
}
}
int main(int argc, char *argv[])
{
/*构建一颗二叉树*/
tree A,B,C,D,E,F,G,H,I,J,K;
A.data = 'A';B.data = 'B';
C.data = 'C';D.data = 'D';
E.data = 'E';F.data = 'F';
G.data = 'G';H.data = 'H';
I.data = 'I';J.data = 'J';
K.data = 'K';
A.left = &B;A.right = &C;
B.left = &D;B.right = &E;
C.left = &F;C.right = &G;
D.left = &H;H.right = &K;
F.left = &I;G.right = &J;
E.left = E.right =D.right = H.left = K.left =K.right
=F.right =I.left =I.right =G.left =J.left =J.right =NULL;
/*测试遍历*/
preorder(&A);
printf("\n");
preorder_other(&A);
printf("\n----------------------\n");
midorder(&A);
printf("\n");
midorder_other(&A);
printf("\n----------------------\n");
lastorder(&A);
return 0;
}
c/c++二叉树的前中后遍历
最新推荐文章于 2023-07-17 20:40:28 发布