#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#define OK  1
#define ERROR 0

#define MAX_TREE_SIZE  100

typedef  char TElemType ;

typedef  TElemType  SqBiTree[MAX_TREE_SIZE];

TElemType Nil='#';

void input(TElemType &x)	 // 函数变量
{
	scanf("%c",&x);
}

void visit(TElemType x)	 // 函数变量
{
	printf("%c",x);
}

void InitBiTree(SqBiTree &T)
{ // 构造空二叉树T。因为T是数组名,故不需要&
	int i;
	for(i=0;i<MAX_TREE_SIZE;i++)
		T[i]=Nil; // 初值为空(Nil在主程中定义)
}


void CreateBiTree(SqBiTree &T)
{ // 按层序次序输入二叉树中结点的值(字符型或整型), 构造顺序存储的二叉树T
	/********** Begin **********/ 
    SqBiTree s;
    int i;
    fgets(s,100,stdin);
    for(i=0;s[i]!='\0';i++){
        T[i+1]=s[i];//printf("%c ",T[i]);
    }
    T[0]=i;
	/********** End **********/
}

int BiTreeEmpty(SqBiTree T)
{ // 初始条件:二叉树T存在。操作结果:若T为空二叉树,则返回TRUE,否则FALSE
	if(T[1]==Nil) // 根结点为空,则树空
		return 1;
	else
		return 0;
}

int BiTreeDepth(SqBiTree T)
{ // 初始条件:二叉树T存在。操作结果:返回T的深度
	/********** Begin **********/ 
	int i=0;
    int j=T[0];
    if(T[i]==Nil)
    return i;
    while(j>0){ 
        j-=pow(2,i);
       i++;
    }
	return i;
	/********** End **********/
}
void PreTraverse(SqBiTree T,int e)
{ // PreOrderTraverse()调用
	/********** Begin **********/ 
	if(T[e]!='#'){
        visit(T[e]);
        PreTraverse(T,2*e);
        PreTraverse(T,2*e+1);
    }
    
	/********** End **********/
}
void PreOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树存在,Visit是对结点操作的应用函数
	// 操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次
	if(!BiTreeEmpty(T)) // 树不空
		PreTraverse(T,1);
	printf("\n");
}

void InTraverse(SqBiTree T,int e)
{ // InOrderTraverse()调用
	/********** Begin **********/ 
	if(T[e]!='#'){
        InTraverse(T,2*e);
        visit(T[e]);
        InTraverse(T,2*e+1);
    }
    
	/********** End **********/
}

void InOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树存在,Visit是对结点操作的应用函数
	// 操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次
	if(!BiTreeEmpty(T)) // 树不空
		InTraverse(T,1);
	printf("\n");
}

void PostTraverse(SqBiTree T,int e)
{ // PostOrderTraverse()调用
	/********** Begin **********/ 
	if(T[e] != '#'){
		PostTraverse(T,2*e);
		PostTraverse(T,2*e+1);
		visit(T[e]);
	}
	/********** End **********/
}

void PostOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
	// 操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次
	if(!BiTreeEmpty(T)) // 树不空
		PostTraverse(T,1);
	printf("\n");
}

void LevelOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 层序遍历二叉树
	/********** Begin **********/ 
	int dep=BiTreeDepth(T);
	int tree_max=pow(dep,2)-1;
	for(int i=1;i<tree_max;i++){
		if(T[i]=='#')
			continue;
		visit(T[i]);
	}
    printf("\n");
	/********** End **********/
}

int main()
{
	TElemType e;
	SqBiTree Bt,s;
	InitBiTree(Bt);
	CreateBiTree(Bt);    
	printf("按先序遍历的结果为:");
	PreOrderTraverse(Bt,visit);
	printf("按中序遍历的结果为:");
	InOrderTraverse(Bt,visit);
	printf("按后序遍历的结果为:");
	PostOrderTraverse(Bt,visit);
	printf("按层序遍历的遍历结果为:");
	LevelOrderTraverse(Bt,visit);  
	printf("该二叉树的高度为:%d\n",BiTreeDepth(Bt) );
	return 0;
}
posted on 2024-06-20 17:41  findscripter  阅读(18)  评论(0)    收藏  举报