树的存储结构
顺序存储:先将二叉树补成完全二叉树,在从上到下从左到右,将所有节点编号,依次存放在缓冲区中
链式存储:树中每个节点相关结构体
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() //创建二叉树
{
char ch;
scanf("%c", &ch);
T_node *root;
if(ch == '#')
{
return NULL;
}
else
{
root = (T_node *)malloc(sizeof(T_node));
if(NULL == root)
{
printf("malloc failed!\n");
return NULL;
}
root->data = ch;
root->l_child = create_tree(); //递归创建左孩子
root->r_child = create_tree(); //递归创建右孩子
return root;
}
}
先序遍历
void Preorder_Traversal(T_node *root)//先序遍历
{
if(root == NULL)
return;
printf("%c",root->data);
Preorder_Traversal(root->l_child);//访问左孩子
Preorder_Traversal(root->r_child);//访问右孩子
}
中序遍历
void Inorder_Traversal(T_node *root)//中序遍历
{
if(root == NULL)
return;
Inorder_Traversal(root->l_child);//访问左孩子
printf("%c",root->data);
Inorder_Traversal(root->r_child);//访问右孩子
}
后序遍历
void l_print(T_node *root) //后序遍历
{
if(root != NULL)
{
l_print(root->l_child);
l_print(root->r_child);
printf("%c", root->data);
}
return;
}
二叉树的层次遍历
层次遍历利用队列,通过队列的先进先出的特性,从而将整个树进行层次遍历。
void Level_Traversal(T_node *root)//层次遍历
{
int rear=1,front=1;
T_node *buf[32]; //定义一个数组,该数组用于存储树的每个结点的地址
int i;
for(i=0;i<32;i++){
buf[i]=NULL; //将整个数组赋为空值
}
if(NULL == root){ //判断是否为空树
return;
}
buf[rear] = root; //将跟结点赋值给数组中第一个元素
while(buf[front] != NULL){
printf("%c",buf[front]->data);//打印第一个入对的元素,即跟结点的值
if(root->l_child != NULL){ //判断该结点下的左孩子结点是否存在,存在则将地址从数组尾部插入
rear++;//插入一个元素,rear的指向向后移一位
buf[rear]=root->l_child;//将左孩子地址插入到数组中
}
if(root->r_child != NULL){//判断该结点下的右孩子结点是否存在,存在则将地址从数组尾部插入
rear++;
buf[rear]=root->r_child;//将左孩子地址插入到数组中
}
front++;
root=buf[front];//此时,front指向第一次插入的跟结点,rear指向数组末尾,接下来要将左孩子结点转变成跟结点,故front++,然后对root赋值
}
}
函数声明模块
#ifndef _TREE_LINK_H
#define _TREE_LINK_H
typedef char data_t;
typedef struct tree_node
{
data_t data;
struct tree_node *l_child; //定义左孩子结点
struct tree_node *r_child; //定义右孩子接点
}T_node;
T_node *Create_T_node();//创建树结点
void Preorder_Traversal(T_node *root);//先序遍历
void Inorder_Traversal(T_node *root);//中序遍历
void Postorder_Traversal(T_node *root);//后序遍历
void Level_Traversal(T_node *root);//层次遍历
#endif
主函数模块
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include "tree_link.h"
int main()
{
T_node *root = Create_T_node();
Preorder_Traversal(root);//先序遍历
printf("\n");
Inorder_Traversal(root);//中序遍历
printf("\n");
Postorder_Traversal(root);//后序遍历
printf("\n");
Level_Traversal(root);//层次遍历
printf("\n");
return 0;
}