标签:var 依次 bsp text 链表 类型 头文件 log meta
//双亲存储的结构类型定义 typedef struct PTNode{ TElemType data; //数据域 int parent; //双亲的位置,根节点的双亲为-1 }PTNode; //双亲的节点类型 typedef struct { PTNode *nodes; //初始化分配的结点数组 int r,nodeNum; //根的位置和结点数 }PTree; //树的双亲存储结构类型
优点: 可用parent直接找到双亲,并且很容易找到祖先。
缺点:需要查找节点的孩子及其子孙时要遍历整个结构。
//双亲孩子存储结构的类型定义 typedef struct ChildNode{ int childIndex; //孩子在结点数组的位置 struct ChildNode *nextChild; //下一个孩子 }ChildNode; //孩子链表中的节点类型 ? typdef struct{ TElemType data; //元素值 int parent; //双亲的位置 struct ChildNode *firstChild; //孩子链表头指针 }PCTreeNode; //双亲节点的节点类型 ? typedef struct{ PCTreeNode *nodes; //节点数组 int nodeNum,r; //结点元素的个数,根位置 }PCTree; //树的双亲孩子存储结构类型
//孩子兄弟链表的类型定义 typedef struct CSTNode{ TElemType data; //数据域 struct CSTNode *firstChild,*nextSibling; //最左孩子指针,右兄弟指针 }CSTnode,*CSTree,*CSForest; //孩子兄弟链表
Status InitTree(CSTree &T); //构造空树 CSTree MakeTree(TElemType e,int n....) //创建根结点为e和n颗子树的树 Status DestroyTree(CSTree &T) //销毁树 int TreeDepth(CSTree T) //返回树的深度 CSNode *Search(CSTree T,TElemType e); //查找树T中的节点e并返回其指针 Status InesertChild(CSTree &T,int i,CSTree c) //插入c为T的第i颗子树,c非空并且与T不相交 Status DeleteChild(CSTree &T,int i) //删除第i棵子树
#include<stdarg.h>// 标准头文件,提供宏va_start、va_arg和va_end, ? CSTree MakeTree(TElemType e,int n....){ int i; CSTree t,p,pi; va_list argptr; //存放变长参数表信息的数组 t=(CSTree)malloc(sizeof(CSTNode)); if(t=NULL) return NULL; t->data=e; //根结点的值为e; t->firstChild=t->nextSibling=NULL; if(n<=0) return t; //若无子树,则返回根结点 va_start(argptr,n) //令argptr 指向n后的第一个实参 p=va_arg(argptr,CSTree); //取第一棵子树的实参转化为CSTree类型 t->firstChild=p; pi=p; for(i=1;i<n;i++){ p=va_arg(argptr,CSTree); //取下一颗子树的实参并转换为CSTree类型 pi->nextSibling=p; pi=p; } va_end(argptr); return t; }
Status InesertChild(CSTree &T,int i,CSTree c){ int j; CSTree p; if(NULL==T||i<1) return ERROR; if(i==1){ //c为第一棵插入子树 c->nextSibling=T->firstChild; T->firstChild=c; //T成为T的第一棵子树 }else{ p=T->firstChild; for(j=2;p!=NULL&&j<i;j++){ p=p->nextSibling; //寻找插入位置 } if(j==i){ c->nextSibling = p->nextSibling; p->nextSibling = c; }else return ERROR; } return OK; }
int TreeDepth(CSTree T) { // 求树T的深度 int dep1, dep2, dep; if(NULL==T) dep = 0; // 树为空,深度则为0 else { dep1 = TreeDepth(T->firstChild); // 求T的子树森林的深度 dep2 = TreeDepth(T->nextSibling); // 求除T所在树以外的其余树的深度 dep = dep1+1>dep2 ? dep1+1 : dep2; // 树的深度 } return dep; }
CSTreeNode* Search(CSTree T, TElemType e) { // 查找树T中的结点e并返回其指针 CSTreeNode* result = NULL; if(NULL==T) return NULL; // 树为空,返回NULL if(T->data==e) return T; // 找到结点,返回其指针 if((result = Search(T->firstChild, e))!=NULL) // 在T的子树森林查找 return result; return Search(T->nextSibling, e); // 在除T所在树以外的其余树构成的森林查找 } ?
标签:var 依次 bsp text 链表 类型 头文件 log meta
原文地址:http://www.cnblogs.com/linwx/p/7911384.html