问题描述:二叉树顺序遍历(先序、中序、后序)及层次遍历的实现。
代码实现:
实现顺序遍历需要三个文件(三个文件在同一目录)。
tree.h(定义二叉树)
tree.c(实现接口函数)
main.c(主函数实现)
tree.h
主要定义二叉树结点结构体struct node_t;
创建二叉树函数bitree *tree_create();
先序遍历函数void preorder(bitree *r);
中序遍历函数void inorder(bitree *r);
后序遍历函数void postorder(bitree *r);
层次遍历函数void layerorder(bitree *r);
typedef char data_t;
typedef struct node_t {
data_t data;
struct node_t *left;
struct node_t *right;
} bitree;
bitree *tree_create();
void preorder(bitree *r);
void inorder(bitree *r);
void postorder(bitree *r);
void layerorder(bitree *r);
tree.c
实现上述函数。
#include <stdio.h>
#include <stdlib.h>
#include "linkqueue.h"
bitree *tree_create() {
data_t ch;
bitree *r;
scanf("%c", &ch);
if (ch == '#')
return NULL;
if ((r = (bitree *) malloc(sizeof(bitree))) == NULL) {
printf("malloc failed\n");
return NULL;
}
r->data = ch;
r->left = tree_create();
r->right = tree_create();
return r;
}
void preorder(bitree *r) {
if (r == NULL) {
return;
}
printf("%c", r->data);
preorder(r->left);
preorder(r->right);
}
void inorder(bitree *r) {
if (r == NULL) {
return;
}
inorder(r->left);
printf("%c", r->data);
inorder(r->right);
}
void postorder(bitree *r) {
if (r == NULL) {
return;
}
postorder(r->left);
postorder(r->right);
printf("%c", r->data);
}
void layerorder(bitree * r){
linkqueue *lq;
if ((lq = queue_create()) == NULL)
return;
if (r == NULL)
return;
printf("%c", r->data);
enqueue(lq, r);
while (!queue_empty(lq)) {
r = dequeue(lq);
if (r->left){
printf("%c", r->left->data);
enqueue(lq, r->left);
}
if (r->right) {
printf("%c", r->right->data);
enqueue(lq, r->right);
}
}
}
main.c
实现创建二叉树,先序遍历函数、中序遍历函数、后序遍历函数,层次遍历函数。
#include "tree.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
bitree *r;
if ((r = tree_create()) == NULL)
return -1;
preorder(r);
puts("");
inorder(r);
puts("");
postorder(r);
puts("");
layerorder(r);
return 0;
}