标题 | 含义 |
深度 | 树的层数 |
度 | 子树的个数 |
叶子 | 没有子节点的节点 |
孩子 | 与父子相对应 |
兄弟 | 具有相同父亲的节点 |
堂兄弟 | 和父亲同层的节点的子节点(相同的爷爷) |
例如:
标题 | |
深度 | 4 |
6的度 | 2,分别是3和7 |
叶子 | 1,5,9 |
4的孩子 | 5 |
2的兄弟 | 4 |
4的堂兄弟 | 8 |
二叉树分类:
标题 | 满足条件 |
满二叉树 | k表示深度,满足2的k次方-1 |
完全二叉树 | 一棵树除有不满足倒数两层的两个节点之外,其他节点必须满足有两个节点 |
存储方式:顺序存储和链式存储
遍历:
标题 | |
按层 | |
先序遍历 | 根左右 |
中序遍历 | 左根右 |
后序遍历 | 左右根 |
例如:
标题 | 排序 |
按层 | A B E C F D G H K |
先序 | A B C D E F G H K |
中序 | B D C A E F H G K |
后序 | D C B H K G F E A |
例子:树状存储
#include<stdio.h>
#include<stdlib.h>
#define NAMESIZE 32
struct score_st//1.定义数组:存放真实有效的数据
{
int id;
char name[NAMESIZE];
int chinese;
int math;
};
struct node_st//2.定义树的实现:链式存储
{
struct score_st data;//data存放真实有效的数据类型,用score_st类型
struct node_st *l,*r;//两个自引用结构体的指针:左右孩子
};
//4.插入数值
int insert (struct node_st** root,struct score_st* data)
{
struct node_st* node;
if(*root == NULL)
{
node = malloc(sizeof(*node));
if(node == NULL)
return -1;
node->data = *data;
node->l = NULL;
node->r = NULL;
*root = node;
return 0;
}
if(data->id <= (*root)->data.id)
return insert(&(*root)->l,data);
else
return insert(&(*root)->r,data);
}
//查找
struct score_st* find(struct node_st* root,int id)
{
if(root == NULL)
return NULL;
if(id == root->data.id)
return &root->data;//data为结构体类型值所以要传地址
if(id < root->data.id)
return find(root->l,id);
else
return find(root->r,id);
}
print_s(struct score_st* data)
{
printf("%d %s %d %d\n",data->id,data->name,data->chinese,data->math);
}
print_s(struct score_st* data)
{
printf("%d %s %d %d\n",data->id,data->name,data->chinese,data->math);
}
//画树
void draw_(struct node_st*root,int level)
{
if(root == NULL)
return ;
draw_(root->r,level+1);
for(int i = 0;i < level; i++)
printf(" ");
print_s(&root->data);
draw_(root->l,level+1);
}
void draw(struct node_st* root)
{
draw_(root,0);
}
int main()
{
//3.构建无头链表
//3.1构建一棵树,为防止野指针的出现把他写成空。
struct node_st* tree = NULL;
struct score_st tmp;//为了调用score_st结构的数据定义的指针
struct score_st *datap;
//3.2创建一棵树
int arr[] = {1,2,3,7,6,5,9,8,4};//定义数值范围
for(int i = 0;i <sizeof(arr)/sizeof(*arr);i++)
{
tmp.id = arr[i];
snprintf(tmp.name,NAMESIZE,"stu%d",arr[i]);
tmp.chinese = rand()%100;
tmp.math = rand()%100;
insert(&tree,&tmp);//往insert()方法:往哪里放,放什么节点
//&tree:放&的原因是因为不带头节点的链表,起始位置会发生变化,
}
draw(tree);
int tmpid = 2;
datap = find(tree,tmpid);
if(datap == NULL)
printf("can not find the id %d\n",tmpid);
else
print_s(datap);
exit(0);
}
运行结果
2 stu2 77 15
9 stu9 90 59
8 stu8 63 26
7 stu7 86 92
6 stu6 49 21
5 stu5 62 27
4 stu4 40 26
3 stu3 93 35
2 stu2 77 15
1 stu1 83 86