树的概念基础

标题含义
深度树的层数
子树的个数
叶子没有子节点的节点
孩子与父子相对应
兄弟具有相同父亲的节点
堂兄弟和父亲同层的节点的子节点(相同的爷爷)

例如:

标题
深度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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值