树的孩子兄弟链表应用

来源:互联网 发布:linux重启tomcat服务 编辑:程序博客网 时间:2024/05/16 15:43
孩子兄弟表示法采用链式存储结构,链表由一个数据域和两个指针域组成。其中,数据域 存放结点的数据信息,一个指针域用来指示结点的第一个孩子结点,另一个指针域用来指示结点的下一个兄弟结点。
#include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <malloc.h>  typedef int ElemType;  typedef struct CSNode//孩子兄弟表示法类型定义  {      ElemType data;      struct CSNode *firstchild,*nextsibling;//指向第一个孩子和下一个兄弟  }CSNode,*CSTree;    void InitCSTree(CSTree *T);//树的初始化  void DestroyCSTree(CSTree *T);//树的摧毁操作  void CreateCSTree(CSTree *T,ElemType *e,int *index);//创建树操作  int DepCSTree(CSTree T);//求树的深度  void PreTraverseCSTree(CSTree T,void(*visit)(ElemType *e));//树的先根遍历  void PostTraverseCSTree(CSTree T,void(*visit)(ElemType *e));//树的后根遍历  void DisplayCSTree(ElemType *e);//输出树的结点  #include "Tree.h"    void InitCSTree(CSTree *T)//树的初始化  {      *T = 0;  }  void DestroyCSTree(CSTree *T)//树的摧毁操作  {      CSTree p = *T;      if(p)      {          DestroyCSTree(&(p->firstchild));          DestroyCSTree(&(p->nextsibling));          free(p);          *T = 0;      }  }  void CreateCSTree(CSTree *T,ElemType *e,int *index)//创建树操作  {      if(e[*index] == 0)      {          *T = 0;          (*index)++;      }      else      {          *T = (CSTree)malloc(sizeof(CSNode));          (*T)->data = e[*index];          (*index)++;          CreateCSTree(&((*T)->firstchild),e,index);          CreateCSTree(&((*T)->nextsibling ),e,index);          return;      }  }  int DepCSTree(CSTree T)//求树的深度  {      CSTree p;      int k,d = 0;      if(T == NULL)      {          return 0;      }      p = T->firstchild ;      while(p != NULL)      {          k = DepCSTree(p);          if(d < k)          {              d = k;          }          p = p->nextsibling ;      }      return d+1;  }  void PreTraverseCSTree(CSTree T,void(*visit)(ElemType *e))//树的先根遍历  {      if(T)      {          (*visit)(&T->data);          PreTraverseCSTree(T->firstchild ,visit);          PreTraverseCSTree(T->nextsibling ,visit);      }  }  void PostTraverseCSTree(CSTree T,void(*visit)(ElemType *e))//树的后根遍历  {      if(T)      {          PostTraverseCSTree(T->firstchild ,visit);          (*visit)(&T->data);          PostTraverseCSTree(T->nextsibling ,visit);      }  }  void DisplayCSTree(ElemType *e)//输出树的结点  {      printf("%2c",*e);  }  #include "Tree.h"    int main(void)  {      int text[] = {'A','B','E',0,'F','H',0,'I',0,'J',0,0,0,'C',0,'D','G',0,0,0,0};      int h = 0;      CSTree T;      InitCSTree(&T);      CreateCSTree(&T,text,&h);      printf("树的先根遍历结果是:\n");      PreTraverseCSTree(T,DisplayCSTree);      printf("\n");      printf("树的后根遍历结果是:\n");      PostTraverseCSTree(T,DisplayCSTree);      printf("\n");      printf("树的深度是:%2d",DepCSTree(T));      printf("\n");      DestroyCSTree(&T);      return 0;  } 

0 0
原创粉丝点击