二叉树的创建及其他操作

//1、	根据下列程序环境的设置,补充完整二叉树的二叉链表结点结构体的定义。
#include "stdio.h"

#define OK 1
#define ERROR 0
typedef int status; 
//下面是二叉树相关的定义
#define MAX 20
typedef char Telemtype;                      
typedef struct BTnode                      
{
	Telemtype data;
	struct BTnode *lchild;
	struct BTnode *rchild;    
}BTnode,*Btree;                         

//2、	在第1题的基础上,补充完整下面的先序创建二叉树函数。
Btree create(Btree &T)
{
	char ch;
	scanf("%c",&ch);
	if(ch=='#') T=NULL;
	else
	{ 
		T=new BTnode;
	    T->data=ch;
	    create(T->lchild);
	    create(T->rchild);
	}
	return T;
}

//3、	在第1和第2题的基础上,编写先序、中序和后序遍历二叉树的函数。
/* 先序*/
int pre_display(Btree T)
{ 
	if(T) 
	{  
	  printf("%3c",T->data);
	  pre_display(T->lchild);
	  pre_display(T->rchild);
}
	return OK; 
}
/* 中序*/
int in_display(Btree T)
{ 	
	if(T!=NULL) 
	{  	 
		in_display(T->lchild);
		printf("%3c",T->data);
		in_display(T->rchild);		
	}
return OK;
}
/* 后序*/
int post_display(Btree T)
{ 
	if(T){
		post_display(T->lchild);
		post_display(T->rchild);
		printf("%3c",T->data);
	}
	
	return OK;
}
status PNodeK(Telemtype &e,int &k,Btree T)
{  	
	if(T){
		k--;
		if(k==0){
			e=T->data;
			return OK;
		}
		if(T->lchild==NULL&&T->rchild==NULL)
			return OK;	
		PNodeK(e,k,T->lchild);
		PNodeK(e,k,T->rchild);
	}
}
//4、	编写求二叉树叶子结点数的函数。
int leavecount(Btree T)    //求叶子结点数
{  
	int n;
	if(T==NULL) return 0;
	if(T->lchild == NULL && T->rchild ==NULL) return 1;
	else n=leavecount(T->lchild)+leavecount(T->rchild);
	return n;
}
//5、输入主函数对上面各个函数实现调用,记录并分析程序的运行结果。
int main()
{ 
	Btree T=NULL;
	Telemtype e=0;
	int k;
	int n;
	printf("输入按先序创建二叉树的序列,如:ABC##DE#G##F###\n");
	if(T=create(T))
	{ 	
		printf("先序遍历OK\n");
		pre_display(T);
		
		printf("\n中序遍历OK\n");
		in_display(T);
		
		printf("\n后序遍历OK\n");
		post_display(T);
		
		n=leavecount(T);
		printf("\n叶子结点数n=%d \n",n);
	}
	else
		printf("ERROR");
	printf("请输入位置K?");
	scanf("%d",&k);
	int m=k;
	PNodeK(e,k,T);
	if(e!=0)
	printf("先序遍历中,第%d个位置的值是:%c",m,e); 
	else printf("未找到!");
}
posted @ 2021-11-18 20:42  一只狗狗  阅读(202)  评论(0)    收藏  举报