#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));
}
【数据结构与算法】二叉树的顺序存储
最新推荐文章于 2022-10-16 17:15:21 发布