二叉树--顺序结构



#include "stdio.h"
#include "stdlib.h"
#include "math.h"

#define MAXSIZE 100
#define MAX_TREE_SIZE  100

typedef int Status;
typedef int TElemType;
typedef TElemType SqBiTree[MAX_TREE_SIZE];

typedef struct {
	int level,order;
	//结点的层,本层序号
}Position;

TElemType Nil=0;  

Status Visit(TElemType c)
{
	printf("%d ",c);
	return 1;
}

//构造空二叉树
Status InitBiTree(SqBiTree T)
{
	int i;
	for (i=0;i<MAX_TREE_SIZE;i++){
		T[i]=Nil;
	}

	return 1;
}

//按照层次顺序输入结点的值
//构造顺序存储的二叉树
Status CreateBiTree(SqBiTree T)
{
	int i=0;
	printf("请按层序输入结点的值,节点数<=%d\n",MAX_TREE_SIZE);
	while (i<10){
		T[i]=i+1;

		if (i!=0&&T[(i+1)/2-1]==Nil&&T[i]!=Nil){
			printf("出现非根结点、无双亲、非空");
			exit(0);
		}
		i++;
	}

	while (i<MAX_TREE_SIZE){
		T[i]=Nil;
		i++;
	}

	return 1;
}
/* 在顺序存储结构中,两函数完全一样 */

Status BiTreeEmpty(SqBiTree T)
{
	if (T[0]==Nil){
		return 1;
	}
	else	
		return 0;
}

int BiTreeDepth(SqBiTree T)
{
	int i,j=-1;
	for (i=MAX_TREE_SIZE-1;i>=0;i--){
		if (T[i]!=Nil){
			break;
		}
	}//找到最后一个结点

	i++;
	do 
	{
		j++;
	} while (i>=powl(2,j));/* 计算2的j次幂。 */
	
	return j;
}

Status Root(SqBiTree T,TElemType *e)
{
	if (BiTreeEmpty(T)){
		return 0;
	}
	else
	{
		*e=T[0];
		return 1;
	}
}

TElemType Value(SqBiTree T,Position e)
{
	return T[(int)powl(2,e.level-1)+e.order-2];
}

Status Assign(SqBiTree T,Position e,TElemType value)
/* 操作结果: 给处于位置e(层,本层序号)的结点赋新值value */
{
	int i=(int)powl(2,e.level-1)+e.order-2;
	if (value!=Nil&&T[(i+1)/2-1]==Nil){
		exit(1);
	}
	else
	{
		if (value==Nil&&(T[2*i+1]==Nil||T[2*i+2]==Nil)){
			return 0;
		}
	}

	T[i]=value;
	return 1;
}

TElemType Parent(SqBiTree T,TElemType e)
{
	int i;
	if (T[0]==Nil){
		return Nil;
	}
	for (i=0;i<=MAX_TREE_SIZE-1;i++){
		if (T[i]==e){
			return T[(i+1)/2-1];
			printf("\n");
		}
	}

	return Nil;
}

TElemType LeftChild(SqBiTree T,TElemType e)
{
	int i;
	if (T[0]=Nil){
		return Nil;
	}

	for (i=0;i<MAX_TREE_SIZE;i++){
		if (T[i]==e){
			return T[2*i+1];
		}
	}
	return Nil;
}

TElemType RightChild(SqBiTree T,TElemType e)
{
	int i;
	if (T[0]=Nil){
		return Nil;
	}
	
	for (i=0;i<MAX_TREE_SIZE;i++){
		if (T[i]==e){
			return T[2*i+2];
		}
	}
	return Nil;
}

TElemType LeftSibling(SqBiTree T,TElemType e)
{
	int i;
	if (T[0]==Nil){
		return Nil;
	}

	for (i=0;i<=MAX_TREE_SIZE-1;i++){
		if (T[i]==e	 &&	i%2==0){
			return	T[i-1];
		}
	}

	return Nil;
}

TElemType RightSibling(SqBiTree T,TElemType e)
{
	int i;
	if (T[0]==Nil){
		return Nil;
	}
	
	for (i=0;i<=MAX_TREE_SIZE-1;i++){
		if (T[i]==e	 &&	i%2){
			return	T[i+1];
		}
	}
	
	return Nil;
}

//前序遍历

void PreTraverse(SqBiTree T,int e)
{
	Visit(T[e]);
	if (T[2*e+1]!=Nil)
		PreTraverse(T,2*e+1);
	if (T[2*e+2]!=Nil)
		PreTraverse(T,2*e+2);
}

Status PreOrderTraverse(SqBiTree T)
{
	if (!BiTreeEmpty(T))
		PreTraverse(T,0);
	printf("\n");

	return 1;
}

//中序遍历
void InTraverse(SqBiTree T, int e)
{
	if (T[2*e+1]!=Nil)
		InTraverse(T,2*e+1);

	Visit(T[e]);

	if (T[2*e+2]!=Nil)
		InTraverse(T,2*e+2);
}

Status InOrderTraverse(SqBiTree T)
{
	if (!BiTreeEmpty(T)){
		InTraverse(T,0);
	}
	printf("\n");
	return 1;
}

//后序遍历
void PostTraverse(SqBiTree T,int e)
{
	if (T[2*e+1]!=Nil)
		PostTraverse(T,2*e+1);
	if (T[2*e+2]!=Nil)
		PostTraverse(T,2*e+2);
	Visit(T[e]);
}

Status PostOrderTraverse(SqBiTree T)
{
	if (!BiTreeEmpty(T)){
		PostTraverse(T,0);
	}
	printf("\n");
	return 1;
}

void LevelOrderTraverse(SqBiTree T)
{
	int i=MAX_TREE_SIZE-1,j;
	while (T[i]==Nil){
		i--;
	}

	for (j=0;j<=i;j++){
		if (T[j]!=Nil)
			Visit(T[j]);
	}

	printf("\n");
}

//逐层,按本层序号输出二叉树
void Print(SqBiTree T)
{
	int j,k;
	Position p;
	TElemType e;

	for (j=1;j<=BiTreeEmpty(T);j++){
		printf("第%d层: ",j);
		for (k=1;k<=powl(2,j-1);k++){
			p.level=j;
			p.order=k;
			e=Value(T,p);
			if (e!=Nil){
				printf("%d:%d  ",k,e);
			}
		}
		printf("\n");
	}

}

int main()
{
	Status i;
	Position p;
	TElemType e;
	SqBiTree T;
	InitBiTree(T);
	CreateBiTree(T);
	i=Root(T,&e);

	if (i){
		printf("根:",e);
	}

	else
		printf("树空,无根\n");
	
	printf("层序遍历\n");
	LevelOrderTraverse(T);
	printf("前序遍历\n");
	PreOrderTraverse(T);

	printf("中序遍历\n");
	InOrderTraverse(T);

	printf("后序遍历\n");
	PostOrderTraverse(T);

	printf("修改结点层号3,本层序号2:");
	p.level=3;
	p.order=2;

	e=Value(T,p);
	printf("原来%d,输入新值50",e);
	e=50;
	Assign(T,p,e);

	printf("前序遍历\n");
	PreOrderTraverse(T);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值