树的孩子兄弟链表应用
2015-07-28 20:32
405 查看
孩子兄弟表示法采用链式存储结构,链表由一个数据域和两个指针域组成。其中,数据域 存放结点的数据信息,一个指针域用来指示结点的第一个孩子结点,另一个指针域用来指示结点的下一个兄弟结点。
#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; }
相关文章推荐
- 7-28
- MongoDB数据库,windows平台的安装
- [LeetCode]Path Sum II
- 面试题26_带随机指针的链表复制
- 在Linux中运行Nancy应用程序
- Android开发的基础知识点
- 多校3 1011 Work
- hdu 5288 OO’s Sequence(two point + rmq)
- 【汇总】UNP第一个程序daytime端口开启。。。。
- PAT (Advanced Level) 1068. Find More Coins (30) DFS+剪枝 或 动态规划
- Java学习之路0728(十二)(Class类、反射、Annotation功能注解)
- HDOJ 1896 Stones(优先队列)
- APP首次启动引导界面和启动界面设置——iOS开发
- 【面试加分项】java异常处理之try_catch_finally
- IOS被遗忘的知识
- OC中 static 与 const 的作用
- Activity里添加ViewGroup ViewGroup里添加ViewGroup
- tinyxml使用笔记与总结 http://www.cppblog.com/elva/archive/2008/04/24/47907.html
- hdu 5319 Painter
- Reorder List