diff --git a/_04.树/01二叉树顺序结构实现_BiTreeArray.c b/_04.树/01二叉树顺序结构实现_BiTreeArray.c new file mode 100644 index 0000000..daf054b --- /dev/null +++ b/_04.树/01二叉树顺序结构实现_BiTreeArray.c @@ -0,0 +1,329 @@ +#include "stdio.h" +#include "stdlib.h" +#include "io.h" +#include "math.h" +#include "time.h" + +#define OK 1 +#define ERROR 0 +#define TRUE 1 +#define FALSE 0 + +#define MAXSIZE 100 /* 洢ռʼ */ +#define MAX_TREE_SIZE 100 /* */ + +typedef int Status; /* StatusǺ,ֵǺ״̬룬OK */ +typedef int TElemType; /* ͣĿǰݶΪ */ +typedef TElemType SqBiTree[MAX_TREE_SIZE]; /* 0ŵԪ洢 */ + +typedef struct +{ + int level,order; /* IJ,() */ +}Position; + +TElemType Nil=0; /* 0Ϊ */ + +Status visit(TElemType c) +{ + printf("%d ",c); + return OK; +} + +/* նTΪTǹ̶飬ı䣬ʲҪ& */ +Status InitBiTree(SqBiTree T) +{ + int i; + for(i=0;i=0;i--) /* ҵһ */ + if(T[i]!=Nil) + break; + i++; + do + j++; + while(i>=powl(2,j));/* 2jݡ */ + return j; +} + +/* ʼ: T */ +/* : T,eTĸ,OK;򷵻ERROR,e޶ */ +Status Root(SqBiTree T,TElemType *e) +{ + if(BiTreeEmpty(T)) /* T */ + return ERROR; + else + { + *e=T[0]; + return OK; + } +} + +/* ʼ: T,eTij(λ) */ +/* : شλe(,)Ľֵ */ +TElemType Value(SqBiTree T,Position e) +{ + return T[(int)powl(2,e.level-1)+e.order-2]; +} + +/* ʼ: T,eTij(λ) */ +/* : λe(,)Ľ㸳ֵvalue */ +Status Assign(SqBiTree T,Position e,TElemType value) +{ + int i=(int)powl(2,e.level-1)+e.order-2; /* 㡢תΪ */ + if(value!=Nil&&T[(i+1)/2-1]==Nil) /* ҶӸǿֵ˫Ϊ */ + return ERROR; + else if(value==Nil&&(T[i*2+1]!=Nil||T[i*2+2]!=Nil)) /* ˫׸ֵҶӣգ */ + return ERROR; + T[i]=value; + return OK; +} + +/* ʼ: T,eTij */ +/* : eTķǸ,򷵻˫,򷵻أգ */ +TElemType Parent(SqBiTree T,TElemType e) +{ + int i; + if(T[0]==Nil) /* */ + return Nil; + for(i=1;i<=MAX_TREE_SIZE-1;i++) + if(T[i]==e) /* ҵe */ + return T[(i+1)/2-1]; + return Nil; /* ûҵe */ +} + + +/* ʼ: T,eTij */ +/* : eӡe,򷵻أգ */ +TElemType LeftChild(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) /* ҵe */ + return T[i*2+1]; + return Nil; /* ûҵe */ +} + +/* ʼ: T,eTij */ +/* : eҺӡeҺ,򷵻أգ */ +TElemType RightChild(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) /* ҵe */ + return T[i*2+2]; + return Nil; /* ûҵe */ +} + +/* ʼ: T,eTij */ +/* : eֵܡeTӻֵ,򷵻أգ */ +TElemType LeftSibling(SqBiTree T,TElemType e) +{ + int i; + if(T[0]==Nil) /* */ + return Nil; + for(i=1;i<=MAX_TREE_SIZE-1;i++) + if(T[i]==e&&i%2==0) /* ҵeΪż(Һ) */ + return T[i-1]; + return Nil; /* ûҵe */ +} + +/* ʼ: T,eTij */ +/* : eֵܡeTҺӻֵ,򷵻أգ */ +TElemType RightSibling(SqBiTree T,TElemType e) +{ + int i; + if(T[0]==Nil) /* */ + return Nil; + for(i=1;i<=MAX_TREE_SIZE-1;i++) + if(T[i]==e&&i%2) /* ҵeΪ() */ + return T[i+1]; + return Nil; /* ûҵe */ +} + +/* PreOrderTraverse() */ +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); +} + +/* ʼ: */ +/* : T */ +Status PreOrderTraverse(SqBiTree T) +{ + if(!BiTreeEmpty(T)) /* */ + PreTraverse(T,0); + printf("\n"); + return OK; +} + +/* InOrderTraverse() */ +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); +} + +/* ʼ: */ +/* : T */ +Status InOrderTraverse(SqBiTree T) +{ + if(!BiTreeEmpty(T)) /* */ + InTraverse(T,0); + printf("\n"); + return OK; +} + +/* PostOrderTraverse() */ +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]); +} + +/* ʼ: T */ +/* : T */ +Status PostOrderTraverse(SqBiTree T) +{ + if(!BiTreeEmpty(T)) /* */ + PostTraverse(T,0); + printf("\n"); + return OK; +} + +/* */ +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<=BiTreeDepth(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); + printf(",շ%d(1: 0:) =%d\n",BiTreeEmpty(T),BiTreeDepth(T)); + i=Root(T,&e); + if(i) + printf("ĸΪ%d\n",e); + else + printf("գ޸\n"); + printf(":\n"); + LevelOrderTraverse(T); + printf("ǰ:\n"); + PreOrderTraverse(T); + printf(":\n"); + InOrderTraverse(T); + printf(":\n"); + PostOrderTraverse(T); + printf("޸ĽIJ32"); + p.level=3; + p.order=2; + e=Value(T,p); + printf("޸ĽԭֵΪ%dֵ:50 ",e); + e=50; + Assign(T,p,e); + printf("ǰ:\n"); + PreOrderTraverse(T); + printf("%d˫Ϊ%d,ҺӷֱΪ",e,Parent(T,e)); + printf("%d,%d,ֱֵܷΪ",LeftChild(T,e),RightChild(T,e)); + printf("%d,%d\n",LeftSibling(T,e),RightSibling(T,e)); + ClearBiTree(T); + printf(",շ%d(1: 0:) =%d\n",BiTreeEmpty(T),BiTreeDepth(T)); + i=Root(T,&e); + if(i) + printf("ĸΪ%d\n",e); + else + printf("գ޸\n"); + + return 0; +} + diff --git a/_04.树/_a.二叉树顺序结构.c b/_04.树/_a.二叉树顺序结构.c new file mode 100644 index 0000000..8ecc8b5 --- /dev/null +++ b/_04.树/_a.二叉树顺序结构.c @@ -0,0 +1,41 @@ +/* + * @Author: Xu Bai + * @Date: 2019-07-09 22:50:41 + * @LastEditors: Xu Bai + * @LastEditTime: 2019-07-09 23:02:42 + */ +#include "stdlib.h" +#include "stdio.h" +#include "io.h" + +#define OK 1 +#define ERROR 0 +#define TRUE 1 +#define FALSE 0 +#define MAXSIZE 100 +/*ڵ */ +#define MAX_TREE_SIZE + +typedef int Status; +/* */ +typedef int ElemType; +/*0ŵԪ洢ڵ */ +typedef ElemType SqBiTree[MAX_TREE_SIZE]; + + +typedef struct +{ + /*IJ䡢ţ㣩 */ + int level, order; +} Position; + +/*0Ϊ */ +ElemType Nil = 0; + +Status visit(ElemType e) +{ + printf("%d ", e); + return OK; +} + +