二叉树--顺序结构

来源:互联网 发布:手机怎样在淘宝买东西 编辑:程序博客网 时间:2024/05/29 13:58



#include "stdio.h"#include "stdlib.h"#include "math.h"#define MAXSIZE 100#define MAX_TREE_SIZE  100typedef 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;}elsereturn 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){returnT[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){returnT[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);}elseprintf("树空,无根\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;}


0 0
原创粉丝点击