目录
树的基本概念
树
(
Tree
)是
n
(
n≥0
)个节点的有限集合
T
,它满足两个条件
:
有且仅有一个特定的称为
根
(
Root
)
的节点
其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树。
一个节点的子树的个数称为该节点的度数,一棵树的度数是指该树中节点的最大度数。
度数为零的节点称为
树叶
或
终端节点
,度数不为零的节点称为分支节点,
除根节点外的分支节点称为内部节点。
一个节点的子树之根节点称为该节点的
子节点
,该节点称为它们的
父节点
,同一节点的各个子节点之间称为兄弟节点。一棵树的根节点没有父节点,叶节点没有子节点。
![](https://i-blog.csdnimg.cn/direct/78c2a4a8117c4910b260ef80f8d389d9.png)
二叉树的概念
二叉树(
Binary
Tree
)
是
n
(
n≥0
)个节点的有限集合,它或者是空集(
n
=
0
),或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。二叉树与普通有序树不同,二叉树严格区分左孩子和右孩子,即使只有一个子节点也要区分左右。
二叉树结构
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);
二叉树创建
bitree * tree_create(){
bitree * r;
char ch;
scanf("%c",&ch);
if(ch == '#'){
//printf("bitree is NULL\n");
return NULL;
}
if((r=(bitree *)malloc(sizeof(bitree)) )== NULL){
printf("bitree malloc error\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);
}
}
puts("");
}