树是由m(m>=0)个结点组成的有序集合,而二叉树的结点的子节点应该为n(n<=2),且严格区分左孩子结点和右孩子结点。
下面为二叉树的链式存储以及二叉树的4种遍历方式。
设有如下二叉树:
A 先序遍历: ABCDEFGHK
/ \ 中序遍历: BDCAEHGKF
B E 后序遍历: DCBHKGFEA
\ \ 层次遍历: ABECFDGHK
C F
/ /
D G
/ \
H K
C语言代码实现:
采用链式存储,递归存入的方式创建二叉树,以’#'表示空结点,运行结果如下:
实现代码:
/*
tree.c
*/
#include "tree.h"
T_node *create_tree() //创建二叉树
{
char c;
if((c = getchar()) != '#'){
T_node *root = (T_node *)malloc(sizeof(T_node));
if(NULL == root){//申请空间失败
printf("malloc failed!\n");
return NULL;
}
root->data = c;
root->l_child = create_tree();//递归创建左孩子节点
root->r_child = create_tree();//递归创建右孩子节点
return root;
}
else{
return NULL;
}
}
//先序遍历
void pre_traversal(T_node *tree)
{
if(!tree){
return;
}
else{
printf("%c ",tree->data);
pre_traversal(tree->l_child);
pre_traversal(tree->r_child);
}
}
//中序遍历
void mid_traversal(T_node *tree)
{
if(!tree){
return;
}
else{
mid_traversal(tree->l_child);
printf("%c ",tree->data);
mid_traversal(tree->r_child);
}
}
//后序遍历
void pos_traversal(T_node *tree)
{
if(!tree){
return;
}
else{
pos_traversal(tree->l_child);
pos_traversal(tree->r_child);
printf("%c ",tree->data);
}
}
//层次遍历
void lev_traversal(T_node *tree)
{
if(tree == NULL) return; //空树返回
T_node *p,*t[32] = {0};
int front,rear; //头尾‘指针’
front = rear = 1; //下标从1开始
t[rear] = tree;
while(t[front] != NULL){
printf("%c ",t[front]->data);
p = t[front];
if(p->l_child != NULL){
t[++rear] = p->l_child;
}
if(p->r_child != NULL){
t[++rear] = p->r_child;
}
front++;
}
}
/*
main.c
*/
#include "tree.h"
int main()
{
T_node *t = create_tree();
printf("先序遍历:");
pre_traversal(t);
puts("");
printf("中序遍历:");
mid_traversal(t);
puts("");
printf("后序遍历:");
pos_traversal(t);
puts("");
printf("层次遍历:");
lev_traversal(t);
puts("");
return 0;
}
/*
tree.h
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef __TREE__
#define __TREE__
typedef int data_t;
typedef struct tree_node{
data_t data; //数据域
struct tree_node *l_child; //指向左孩子节点
struct tree_node *r_child; //指向右孩子节点
}T_node;
//创建树
T_node *create_tree();
//先序遍历
void pre_traversal(T_node *tree);
//中序遍历
void mid_traversal(T_node *tree);
//后序遍历
void pos_traversal(T_node *tree);
//层次遍历
void lev_traversal(T_node *tree);
#endif