二叉树的顺序存储

二叉树的顺序存储:
二叉树的顺序存储就是用一组连续的存储单元来存放二叉树的数据元素。首先要对树中的每个结点进行编号,编号顺序就是结点在顺序表中的存储顺序。编号方法是:按照完全二叉树的形式,根结点的编号为1,然后按照层次从上到下、每层从左到右的顺序对每个结点进行编号。当某结点是编号为i的结点的左孩子时,它的编号应为2i,当他是右孩子时编号则为2i+1。

二叉树的顺序存储表示:

#define MAX_SIZE 256    //二叉树的最大结点数
typedef TElem SqBiTree[MAX_SIZE];    //根结点存储在1号单元
SqBiTree bt;

在这里插入图片描述
在二叉树的顺序存储中,如果已知一个结点的编号,就能方便的找到其双亲和孩子结点。但该存储结构不适合结点的删除和插入,也就是不适合结点出现动态变化的情况,此外用顺序结构存储非完全二叉树时,顺序表中会出现很多空闲位置。

具体代码如下,由于在顺序结构中前、中、后序遍历二叉树以及插入删除操作不便实现,相关操作早链式结构中实现。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#define OK 1
#define ERROR 0
#define MAX_SIZE 256

typedef int ElemType, Status;

typedef ElemType SqBiTree[MAX_SIZE];

SqBiTree bt;

Status InitBiTree(SqBiTree& T)    //初始化顺序二叉树
{
	memset(T, -1, sizeof(ElemType));    //设结点值为-1表示空结点, 将二叉树所有结点设为空结点
	return OK;
}

Status DestroyBiTree(SqBiTree& T)    //销毁顺序二叉树
{
	memset(T, -1, sizeof(ElemType));    //与初始化一样
	return OK;
}

Status ClearBiTree(SqBiTree& T)    //清空顺序二叉树
{
	memset(T, -1, sizeof(ElemType));    //与初始化一样
	return OK;
}

Status CreateBiTree(SqBiTree& T)    //创建顺序二叉树
{
	printf_s("按完全二叉树顺序输入结点值(结点不存在输入-1):\n");
	int i = 1;
	while (scanf_s("%d", &T[i]))
	{
		i++;
	}
	return OK;
}

Status BiTreeEmpty(SqBiTree T)    //顺序二叉树判空
{
	if (T[1] == -1) return OK;    //根结点为空
	return ERROR;
}

Status BiTreeDepth(SqBiTree T)    //顺序二叉树的深度
{
	int count = 0;
	for (int i = 1; i < 256; i++)
	{
		if (T[i] != -1)
			count = i;
	}
	int depth = log2(count) + 1;
	return depth;
}

Status Root(SqBiTree T)    //顺序二叉树的根结点
{
	if (T[1] != -1)
		return T[1];
	return ERROR;
}

Status Value(SqBiTree T, int cur_p, ElemType& e)    //返回相应结点的值
{
	if (T[cur_p] != -1)
	{
		e = T[cur_p];
		return OK;
	}
	return ERROR;
}

Status Parent(SqBiTree T, int cur_p, ElemType& e)    //返回相应结点的双亲结点
{
	if (cur_p == 1 || T[cur_p] == -1) return ERROR;
	e = T[cur_p / 2];
	return OK;
}

Status LeftChild(SqBiTree T, int cur_p, ElemType& leftChild)    //返回相应结点的左孩子
{
	if (T[cur_p] == -1) return ERROR;
	if (cur_p * 2 < 256 && T[cur_p * 2] != -1) {
		leftChild = T[cur_p * 2];
		return OK;
	}
	return ERROR;
}

Status RightChild(SqBiTree T, int cur_p, ElemType& rightChild)    //返回相应结点的右孩子
{
	if (T[cur_p] == -1) return ERROR;
	if (cur_p * 2 + 1 < 256 && T[cur_p * 2 + 1] != -1)
	{
		rightChild = T[cur_p * 2 + 1];
		return OK;
	}
	return ERROR;
}

Status LeftBrother(SqBiTree T, int cur_p, ElemType& leftBrother)    //返回相应结点的左兄弟
{
	if (T[cur_p] == -1) return ERROR;
	if (T[cur_p - 1] != -1 && cur_p / 2 == (cur_p - 1) / 2) {
		leftBrother = T[cur_p - 1];
		return OK;
	}
	return ERROR;
}

Status RightBrother(SqBiTree T, int cur_p, ElemType& rightBrother)    //返回相应结点的右兄弟
{
	if (T[cur_p] == -1) return ERROR;
	if (T[cur_p + 1] != -1 && cur_p / 2 == (cur_p + 1) / 2) {
		rightBrother = T[cur_p + 1];
		return OK;
	}
	return ERROR;
}

Status TraverseBiTree(SqBiTree T)    //遍历顺序二叉树
{
	int i = 1;
	while (i < 256)
	{
		printf_s("%d ", T[i]);
		i++;
	}
	return OK;
}
  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值