二叉树的顺序存储结构

 

其实呢也就是将树这种有指向的二维数据 像二维数组一样存在一个线性的 一维的 数据结构中

下面来完成二叉树的顺序存储(一帮用于完全二叉树 避免内存浪费)

        

在顺序存储中如上图所示完成树的存储

#include<stdio.h>
#include<conio.h>

#define MAX_SIZE 1024

//定义顺序树类型
typedef char SeqTree[MAX_SIZE];

void InitSeqTree(SeqTree tree); //初始化空二叉树
void CreatSeqTree(SeqTree tree , int i); //i为数组的下标

void InitSeqTree(SeqTree tree)
{

	//将字符数组中的所有元素初始化赋值
	for(int i = 0 ; i < MAX_SIZE ; i++ )
	{
		tree[i] = '\0';
	}
	
}

void CreatSeqTree(SeqTree tree , int i)
{
	char ch;
	ch = getchar();
	fflush(stdin); //清空键盘缓存区
	if(ch == '^'){ //当输入^时结束节点输入
	    tree[i] = '\0';
		return;
	}
	tree[i] = ch;
    //建立完节点提示输入左子树和右子树
	printf("请输入左子树:\n");
	CreatSeqTree(tree , 2 * i + 1);
	printf("请输入右子树:\n");
	CreatSeqTree(tree , 2 * (i + 1));
}

void PrintSeqTree(SeqTree tree)
{
	for(int i = 0 ; i < MAX_SIZE ; i++)
	{
		printf("%c",tree[i]);
	}	
}

void main()
{
	SeqTree tree;
	InitSeqTree(tree);
	printf("请输入根节点内容:");
	CreatSeqTree(tree,0);
	PrintSeqTree(tree);
}

到这里我们要知道这样建立的二叉树是按照下面的次序进行的

可以看到按照标号存入顺序表

下面我们完成二叉树的其他方法

#include<stdio.h>
#include<conio.h>
#include<math.h>

#define MAX_SIZE 1024

//定义顺序树类型
typedef char SeqTree[MAX_SIZE];

void InitSeqTree(SeqTree tree); //初始化空二叉树
void CreatSeqTree(SeqTree tree , int i); //i为数组的下标

void InitSeqTree(SeqTree tree)
{

	//将字符数组中的所有元素初始化赋值
	for(int i = 0 ; i < MAX_SIZE ; i++ )
	{
		tree[i] = '\0';
	}
	
}

void CreatSeqTree(SeqTree tree , int i)
{
	char ch;
	ch = getchar();
	fflush(stdin); //清空键盘缓存区
	if(ch == '^'){ //当输入^时结束节点输入
	    tree[i] = '\0';
		return;
	}
	tree[i] = ch;
    //建立完节点提示输入左子树和右子树
	printf("请输入左子树:\n");
	CreatSeqTree(tree , 2 * i + 1);
	printf("请输入右子树:\n");
	CreatSeqTree(tree , 2 * (i + 1));
}

//获得树的根节点
char GetSeqTreeRoot(SeqTree tree)
{
	return tree[0];
}

//获取节点总数
int GetSeqTreeLength(SeqTree tree)
{
	int len = 0;
	for(int i = 0 ; i < MAX_SIZE ; i++)
	{
		if(tree[i] == '\0'){
			continue;
		}
		len++;
	}
	return len;
}

//获取深度 深度为k的二叉树最多有2^k - 1个节点
int GetSeqTreeDepth(SeqTree tree)
{
	int depth = 0;
	int len = GetSeqTreeLength(tree);
	while((int)pow(2,depth) - 1 < len)
	{
		depth++;
	}
	return depth;
}

void PrintSeqTree(SeqTree tree)
{
	for(int i = 0 ; i < MAX_SIZE ; i++)
	{
		printf("%c",tree[i]);
	}	
}

void main()
{
	SeqTree tree;
	InitSeqTree(tree);
	printf("请输入根节点内容:");
	CreatSeqTree(tree,0);
	PrintSeqTree(tree);
	GetSeqTreeDepth(tree);
}

 

  • 38
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值