在二叉树的先序遍历中,传递的函数很可能需要知道当前递归的层数(比如文件目录的打印)
参考书上并未考虑到这一问题,下面对这一问题进行解决。
#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);
}