資料結構——樹的簡單操作
阿新 • • 發佈:2018-12-14
//樹的實現 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{ int data; struct node* left; struct node* right; }treeNode; //初始化佇列 typedef struct QueueNode{ struct treeNode* n; struct QueueNode* next; }QueueNode; int Max=100;//深度 char *p; //訪問結點資料 void VisitNode(treeNode* n){ printf("%d ",n->data); } //先序遍歷 void PreOrder(treeNode* n){ if(n!=NULL){ VisitNode(n); PreOrder(n->left); PreOrder(n->right); } } //後序遍歷 void PostOrder(treeNode* n){ if(n!=NULL){ PostOrder(n->left); PostOrder(n->right); VisitNode(n); } } //中序遍歷 void InOrder(treeNode* n){ if(n!=NULL){ InOrder(n->left); VisitNode(n); InOrder(n->right); } } //求深度 void DeepTree(treeNode* n,int m){ if(n!=NULL){ m++; if(Max<m) Max=m; DeepTree(n->left,m); DeepTree(n->right,m); } } //樹的層次遍歷 void LevelOrder(treeNode* n){ treeNode list[50],m;//list佇列 int top,base; top=0; base=0; list[top++]=*n; //根結點入隊 while(top!=base){ //入隊list[top]的左右結點 m=list[base]; if(m.left) list[top++]=*m.left; if(m.right) list[top++]=*m.right; //出隊 base++; VisitNode(&m); } } //入隊 void DeQueue(QueueNode** Rear,treeNode** n){ QueueNode* m=(QueueNode*)malloc(sizeof(QueueNode)); (*n)->left=NULL; (*n)->right=NULL; m->n=*n; m->next=NULL; (*Rear)->next=m; (*Rear)=m; } //出隊 treeNode* ExQueue(QueueNode* front){ QueueNode* m=front->next; front->next=m->next; return m->n; } //判空 int IsEmptyQueue(QueueNode* Rear,QueueNode* front){ return Rear==front?1:0; } //生成二叉樹(層序) void LevelInput(treeNode* tree){ //例項化佇列 QueueNode* Queue; QueueNode* Rear; char a[50]; int i=0; //頭尾指標指向頭結點 Queue=Rear=(QueueNode*)malloc(sizeof(QueueNode)); gets(a); //根結點入隊 tree->data=a[i++]-48; DeQueue(&Rear,&tree); if(Queue->next==NULL){ //空佇列 Queue->next=Rear; } while(i!=strlen(a)){ //上一個結點出隊 treeNode* r=ExQueue(Queue); //申請結點 treeNode* mleft=(treeNode*)malloc(sizeof(treeNode)); treeNode* mright=(treeNode*)malloc(sizeof(treeNode)); //左結點操作 if(a[i]!='#'){ mleft->data=a[i++]-48; //結點拼接 r->left=mleft; //mleft結點入隊 DeQueue(&Rear,&mleft); if(Queue->next==NULL){ //空佇列 Queue->next=Rear; } } else{ r->left=NULL; i++; } if(i==strlen(a)){ continue; } //右結點操作 if(a[i]!='#'){ mright->data=a[i++]-48; //結點拼接 r->right=mright; //mright結點入隊 DeQueue(&Rear,&mright); if(Queue->next==NULL){ //空佇列 Queue->next=Rear; } } else{ r->right=NULL; i++; } } } //生成二叉樹(先序) treeNode* PreInput(){ treeNode* temp; while(*p==' ')p++;//去掉空格 if(*p=='#'){ p++; return NULL; } if(*p!='\0'){ temp = (treeNode *)malloc(sizeof(treeNode)); temp->data=*p++-48; temp->left=PreInput(); temp->right=PreInput(); } return temp; } void test1(){ //先序 treeNode * head; char str[50];p=str; gets(str); if(*p!='\0'&&*p!=' '&&*p!='#'){ head=(treeNode *)malloc(sizeof(treeNode)); head->data=*p++-48; head->left=PreInput(); head->right=PreInput(); } printf("\n"); LevelOrder(head); } void test2() { //層序 treeNode* tree; tree=(treeNode*)malloc(sizeof(treeNode)); LevelInput(tree); LevelOrder(tree); printf("\n"); }