在二叉树的先序遍历中,传递的函数很可能需要知道当前递归的层数(比如文件目录的打印)
参考书上并未考虑到这一问题,下面对这一问题进行解决。
#include<stdio.h> #include<malloc.h> #define ElemType char #define status int #define success 1 #define fail 0 #define bool int #define true 1 #define false 0 //二叉树的二叉链存储 //构造结点结构 struct BTNode{ struct BTNode* lchild; struct BTNode* rchild; ElemType data; }; //定义数据结构:树结点 树(结点的指针) typedef struct BTNode BTNode; typedef BTNode* BiTree;
//Init_BiTree(&b)初始化一个树(分配一个节点的空间) status Init_BiTree(BiTree *bt){ *bt = (BTNode *)malloc(sizeof(BTNode)); if((*bt)!= NULL){ (*bt) -> lchild = NULL; (*bt) -> rchild = NULL; return success; } else{ return false; } }
void PreOrd(BiTree father,void(*fun)(ElemType* b,int m)){ /* 用fun函数先序遍历二叉树father。 father 二叉树 fun 函数,参数b为ElemType型的指针,m是当前的层数 如果您编写的fun不含参数m,请重新编写; */ void RawPreOrd(BiTree father,void(*fun)(ElemType *b,int layer),int m) { /* 参数说明: father 一个二叉树 fun 一个针对于ElemType的可读可写函数 m 记录当前递归的层数,建议设置为0 fun函数说明: 返回值为空,所以如果需要取参数的话,请采用赋值地址参数的方式 b ElemType型的指针 ceng 额外的一个整数,在这里被赋值为当前递归的层数,方便使用 注意: 若,您引用的函数没有针对ceng的参数,请重新编写一个函数用来引用 */ if(father==NULL) return; fun(&(father->data),m); RawPreOrd(father->lchild,fun,m+1); RawPreOrd(father->rchild,fun,m+1); } RawPreOrd(father,fun,0); }
void TestPreOrd(ElemType *c,int m){ int i = 0; for(i=0;i<m;i++){ printf("----"); } *c = *c + 2; printf("%c\n",*c); }//用来测试先序遍历的函数
int main() { BiTree B,B1,B2,B11,B12,B21,B22;//声明“子树” Init_BiTree(&B); Init_BiTree(&B1); Init_BiTree(&B2); Init_BiTree(&B11); Init_BiTree(&B12); Init_BiTree(&B21); Init_BiTree(&B22); B->data = '0'; B1->data = '1'; B2->data = '2'; B11->data = '3'; B12->data = '4'; B21->data = '5'; B22->data = '6'; B->lchild = B1; B->rchild = B2; B1->lchild = B11; B1->rchild = B12; B2->lchild = B21; B2->rchild = B22; PreOrd(B,TestPreOrd); }