树一共有四种遍历方式,包括前序遍历,中序遍历,后序遍历和层序遍历。
前中后三种方式的代码是相似的,而层序遍历的却不同。
前序遍历是第一次遇到这个节点输出,中序遍历是第二次遇到这个节点输出,后序遍历是第三次遇到这个节点输出。
层序遍历是通过队列的方式遍历。
//前序遍历
void preordertraversal(bintree t)
{
if(t)
{
printf("%d ",t->data );
preordertraversal(t->left );
preordertraversal(t->right );
}
}
//中序遍历
void inordertraversal( bintree t )
{
if(t)
{
inordertraversal(t->left );
printf("%d ",t->data );
inordertraversal(t->right );
}
}
//后序遍历
void postordertraversal(bintree t)
{
if(t)
{
postordertraversal(t->left );
postordertraversal(t->right );
printf("%d ",t->data);
}
}
//层序遍历
void levelordertraversal( bintree t )
{
position queue[200];
bintree p;
int head = 0 ;
int tail = 0 ;
if(!t)
return ;
if(t)
{
queue[tail++] = t;
while(head!=tail)
{
p = queue[head++];
printf("%d ",p->data );
if(p->left != NULL)
queue[tail++] = p->left ;
if(p->right != NULL)
queue[tail++] = p->right ;
}
}
}
完整代码(用了插入操作):
#include<stdio.h>
#include<stdlib.h>
typedef struct node* position;
typedef position bintree;
struct node{
int data;
bintree left;
bintree right;
};
void levelordertraversal( bintree t )
{
position queue[200];
bintree p;
int head = 0 ;
int tail = 0 ;
if(!t)
return ;
if(t)
{
queue[tail++] = t;
while(head!=tail)
{
p = queue[head++];
printf("%d ",p->data );
if(p->left != NULL)
queue[tail++] = p->left ;
if(p->right != NULL)
queue[tail++] = p->right ;
}
}
}
void preordertraversal(bintree t)
{
if(t)
{
printf("%d ",t->data );
preordertraversal(t->left );
preordertraversal(t->right );
}
}
void inordertraversal( bintree t )
{
if(t)
{
inordertraversal(t->left );
printf("%d ",t->data );
inordertraversal(t->right );
}
}
void postordertraversal(bintree t)
{
if(t)
{
postordertraversal(t->left );
postordertraversal(t->right );
printf("%d ",t->data);
}
}
void levelordertraversal( bintree t )
{
position queue[200];
int head = 0 ;
int tail = 0 ;
if(!t)
return ;
if(t)
{
queue[tail++] = t;
while(head!=tail)
{
position t = queue[head++];
printf("%d ",t->data );
if(t->left != NULL)
queue[tail++] = t->left ;
if(t->right != NULL)
queue[tail++] = t->right ;
}
}
}
int main()
{
int n;
bintree t = NULL ;//记得设空节点!
scanf("%d",&n);
int num;
for(int i = 0; i < n; i++ )
{
scanf("%d",&num);
t = insert(t,num);//注意!
}
printf("Inorder:"); inordertraversal(t); printf("\n");
printf("Preorder:"); preordertraversal(t); printf("\n");
printf("Postorder:"); postordertraversal(t); printf("\n");
printf("Levelorder:"); levelordertraversal(t); printf("\n");
}