数据结构(树)

树是一种非线性的数据结构
根节点:没有父结点的结点
叶节点:没有结节点的节点,度为0的结点
分支节点:有结点的节点,度非0的结点
子节点
父节点
树的度:所有结点中度的最大值
树的高度 = 树的层次

二叉树

二叉树
树的度最大为2的树
满二叉树:所有结点度为2
完全二叉树:允许缺结点,按顺序去(最后往前删)
性质1:
在二叉树的第n层最多有2^(n-1)个结点点
性质2:
高度为k的二叉树最多有2^k-1个结点
性质3:
度为2的结点个数+1= 度为0的节点个数
性质4:
n个节点
高度为Log2n的+1;
回调函数:用函数指针传递
二叉树的遍历:(递归)
1、前序遍历
任何一个结点遍历满足根、左、右的规律。
2、中序遍历
任何一个结点遍历满足左、根、右的规律。
3、后序遍历
任何一个结点遍历满足左、右。根的规律。
4、层遍历

在这里插入图片描述

代码

#include "Btree.h"
#include <stdlib.h>
#include <stdio.h>

//创建空的树
BTree *Create()		
{
	BTree *btree = (BTree *)malloc(sizeof(BTreeNode)/sizeof(char));
	if(NULL == btree)
		return;
	
	return btree;
}

//插入数据
BOOL Inster(BTree *btree,BTreedata data,int way,int steps,MOUNTWAY mw)
{
	if(NULL == btree)
		return FALSE;
	
	BTreeNode *node = (BTreeNode *)malloc(sizeof(BTreeNode)/sizeof(char));
	if(NULL == node)
		return FALSE;
	
	node->lchild = NULL;
	node->rchild = NULL;
	node->data   = data;
	
	int waynode = 0;
	BTreeNode *tmp = btree->root;	//当前要插入的结点
	BTreeNode *parent = NULL;		//父结点
	
	while(tmp != NULL && steps > 0)
	{
		waynode = way&1;
		way >>= 1;
		parent = tmp;
		if(LEFT == waynode)
			tmp = tmp->lchild;
		else
			tmp = tmp->rchild;
		steps--;
	}
	
	if(LEFT == mw)					//将原来结点挂载到新结点下
		node->lchild = tmp;
	else
		node->rchild = tmp;
	
	if(parent != NULL)
	{
		if(LEFT == waynode)				//将插入的结点挂载到原来的结点上
			parent->lchild = node;
		else
			parent->rchild = node;
	}
	else
		btree->root = node;
	
	return TRUE;
}

//删除的递归函数
void r_delete(BTreeNode *tmp)
{
	if(NULL == tmp)
		return;
	
	r_delete(tmp->lchild);	//释放左结点
	r_delete(tmp->rchild);	//释放右结点
	free(tmp);					//释放自己
}

BOOL Delete(BTree *btree,int way,int steps)
{
	if(NULL == btree)
		return FALSE;
	
	int waynode = 0;
	BTreeNode *tmp = btree->root;
	BTreeNode *parent = NULL;
	
	while(steps > 0 && tmp != NULL)
	{
		waynode = way&1;
		way >>= 1;
		parent = tmp;
		if(LEFT == waynode)
			tmp = tmp->lchild;
		else
			tmp = tmp->rchild;
		steps--;
	}
	if(parent != NULL)
	{
		if(LEFT == waynode)
			parent->lchild = NULL;
		else
			parent->rchild = NULL;
	}
	else
		btree->root =NULL;
	
	r_delete(tmp);
	
	return TRUE;
}

//打印的递归
void r_display(BTreeNode *node,PFUNC callback,int level)
{		
	callback(node,level);
	//打印自己
	if(NULL == node)
		return;
	if(node->lchild != NULL || node->rchild != NULL)
	{
		//打印左结点
		r_display(node->lchild,callback,level+1);
		//打印右结点
		r_display(node->rchild,callback,level+1);
	}
}

void Btree_display(BTree *btree,PFUNC callback)
{
	if(NULL == btree)
		return;
	
	r_display(btree->root,callback,1);
}

//计算结点
int r_count(BTreeNode *node)
{
	if(NULL == node)
		return 0;
	int lc = r_count(node->lchild);			//左子树的结点
	int rc = r_count(node->rchild);			//右子树的结点
	
	return lc+rc+1;
}

int Count(BTree *btree)
{
	if(NULL == btree)
		return 0;
	
	r_count(btree->root);
}

//计算高度
int r_height(BTreeNode *node)
{
	if(NULL == node)
		return 0;
	
	int lh = r_height(node->lchild);		//左子树的高度
	int rh = r_height(node->rchild);		//右子树的高度
	
	return (lh>rh?lh:rh)+1;
}

int Height(BTree *btree)
{
	if(NULL == btree)
		return 0;
	
	r_height(btree->root);
}

//计算树的度
int r_degree(BTreeNode *node)
{
	if(NULL == node)
		return 0;
	
	int degree = 0;
	if(node->lchild != NULL)
		degree++;
	if(node->rchild != NULL)
		degree++;
	
	if(degree != 2)
	{
		int ldegree = r_degree(node->lchild);			//左子树的度
		int rdegree = r_degree(node->rchild);			//右子树的度
	
		if(degree < ldegree)
			degree = ldegree;
		if(degree < rdegree)
			degree = rdegree;
	}
	
	return degree;
}

int Degree(BTree *btree)
{
	if(NULL == btree)
		return 0;
	
	r_degree(btree->root);
}

//销毁树
void deport(BTree *btree)
{
	if(NULL == btree)
		return;
	
	r_delete(btree->root);
	free(btree);
}

//前序遍历
void pet_pos(BTreeNode *node)
{
	if(NULL == node)
		return;
	printf("%2c",node->data);//根
	pet_pos(node->lchild);//左
	pet_pos(node->rchild);//右
}

//中序遍历
void mid_pos(BTreeNode *node)
{
	if(NULL == node)
		return;
	mid_pos(node->lchild);//左
	printf("%2c",node->data);//根
	mid_pos(node->rchild);//右
}

//后序遍历
void last_pos(BTreeNode *node)
{
	if(NULL == node)
		return;
	last_pos(node->lchild);//左
	last_pos(node->rchild);//右
	printf("%2c",node->data);//根
}


//遍历
void pos(BTree *btree)
{
	if(NULL == btree)
		return;
	
	//前序遍历
	printf("前序遍历:");
	pet_pos(btree->root);
	printf("\n");
	//中序遍历
	printf("中序遍历:");
	mid_pos(btree->root);
	printf("\n");
	//后序遍历
	printf("后序遍历:");
	last_pos(btree->root);
	printf("\n");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值