#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;
}