C语言中二叉树先序遍历的改进(传递当前递归层序号)

在二叉树的先序遍历中,传递的函数很可能需要知道当前递归的层数(比如文件目录的打印)

参考书上并未考虑到这一问题,下面对这一问题进行解决。

#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);
} 

猜你喜欢

转载自blog.csdn.net/Ecust_applied_math/article/details/80032884