数据结构 P6 树和二叉树
简介
树
树(Tree)是n(n>=0)个结点的有限集;n=0时称为空树。在任意一颗非空树中
1.有且仅有一个特定的称为根(Root)的结点
2.当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中一个集合本身又是一棵树,并且称为根的子树(SubTree)
二叉树
二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成
链式二叉树的实现
创建结构体
创建文件
编写Makefile
test:test.o tree.o
gcc -o test test.o tree.o
test.o:test.c tree.h
gcc -c test.c
tree.o:tree.c tree.h
gcc -c tree.c
.PHONY:clean
clean:
rm *.o
编写结构体
#ifndef __TREE_H__
#define __TREE_H__
//创建char结构体别名为data_t
typedef char data_t;
//创建二叉树结构体
typedef struct node_t{
data_t data;
struct node_t *left;
struct node_t *right;
}bittree;
创建树
创建头文件
创建树
//创建二叉树
bittree *tree_create(){
data_t ch;
bittree *r;
scanf("%c",&ch);
if(ch == '#'){
return NULL;
}
if((r = (bittree *)malloc(sizeof(bittree))) == NULL){
printf("malloc is failed\n");
return NULL;
}
r->data = ch;
r->left = tree_create();
r->right = tree_create();
return r;
}//创建二叉树
先序遍历
创建头文件
创建先序遍历函数
void preorder(bittree *r){
if(r == NULL){
return;
}
printf("%c",r->data);
preorder(r->left);
preorder(r->right);
}//先序遍历
编写test.c
测试程序(以图例的树为例)
中序遍历
创建头文件
创建中序遍历函数
void inorder(bittree *r){
if(r == NULL){
return;
}
inorder(r->left);
printf("%c",r->data);
inorder(r->right);
}//中序遍历
编写test.c
测试程序(以图例的树为例)
后序遍历
创建头文件
创建后序遍历函数
void postorder(bittree *r){
if(r == NULL){
return;
}
postorder(r->left);
postorder(r->right);
printf("%c",r->data);
}//后序遍历
编写test.c
测试程序(以图例的树为例)