【数据结构与算法】二叉树的顺序存储

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>
//创建结构体
typedef struct TreeArray
{
	char* arr;
	size_t cal;
}TreeArray;
//创建
TreeArray* create_tree(char* level_str)
{
	TreeArray* tree = malloc(sizeof(TreeArray));
	tree->cal = strlen(level_str)+1;
	tree->arr = malloc(tree->cal);
	strcpy(tree->arr+1,level_str);
	return tree;
}
//前序遍历子函数
void _dlr_show(TreeArray* tree,int index)
{
	if(index >= tree->cal || '#'==tree->arr[index])
		return;
	printf("%c",tree->arr[index]);
	_dlr_show(tree,index*2);
	_dlr_show(tree,index*2+1);
}
//前序遍历
void dlr_show(TreeArray* tree)
{
	_dlr_show(tree,1);		
}
//计算树高的子函数
size_t _hight_tree(TreeArray* tree,size_t index)
{
	if(index >= tree->cal || '#'==tree->arr[index])
		return 0;

	size_t lh = _hight_tree(tree,index*2);
	size_t rh = _hight_tree(tree,index*2+1);
	return lh>rh ? lh+1 : rh+1;
}
//计算树高
size_t hight_tree(TreeArray* tree)
{
	return _hight_tree(tree,1);
	/*
	for(size_t h=1; ; h++)
	{
		if(pow(2,h) > tree->cal)
		{
			return h;
		}
	}
	*/
}
//计算树的密度
size_t density_tree(TreeArray* tree)
{
	size_t density = 0;
	for(size_t i=1; i<tree->cal; i++)
	{
		if('#'!=tree->arr[i])
			density++;
	}
	return density;
}
//判断是否平衡的子函数
bool _blance_tree(TreeArray* tree,size_t index)
{
	if(index >= tree->cal || '#'==tree->arr[index])
		return true;
	
	int lh = _hight_tree(tree,index*2);
	int rh = _hight_tree(tree,index*2+1);
	return abs(lh-rh)<2 && 
		_blance_tree(tree,index*2) && 
		_blance_tree(tree,index*2+1);
}
//判断平衡
bool blance_tree(TreeArray* tree)
{
	_blance_tree(tree,1);	
}
//测试
int main(int argc,const char* argv[])
{
	TreeArray* tree = create_tree("ABCD#EFGH###J####I");
	dlr_show(tree);
	printf("tree hight:%d\n",hight_tree(tree));
	printf("tree density:%d\n",density_tree(tree));
	printf("is blance:%d\n",blance_tree(tree));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值