`
hufeng
  • 浏览: 100985 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论
阅读更多
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"
typedef char DataType;

//前序输入的测试数据 data ABC***DE*G**F**
//定义二叉树结构体类型
typedef struct btree
{
	DataType data;
	struct btree *lchild,*rchild;
}BTree,*PTree;


/*层次化初始二叉树 比较牛,PS:层次化输出参考图的广度优先遍历算法*/
void levelCreateBTree(PTree *t,char *v,int i,int l)
{
	if(i>l)*t=NULL;
	else{
		*t = (PTree)malloc(sizeof(BTree));
		(*t)->data=v[i];
		levelCreateBTree(&(*t)->lchild,v,i*2+1,l);
		levelCreateBTree(&(*t)->rchild,v,i*2+2,l);
	}
}

//二叉树前序输入初始化
void preCreateBTree(PTree *t)
{
	char c;
	c=getchar();
	if(c=='*')
	{
		*t=NULL;return;
	}
	*t=(PTree)malloc(sizeof(BTree));
	(*t)->data=c;
	preCreateBTree(&((*t)->lchild));
	preCreateBTree(&((*t)->rchild));
}

//二叉树前序后序输入初始化 // 测试数据 abdg cefh dgba echf
//pre 前序输入字符串 pres 前序起始长度 pree 前序终止长度 in 中序输入字符串 ins 中序起始长度 ine 中序终止长度


void preInCreateBTree1(PTree *t,char *pre,int pres,int pree,char *in,int ins,int ine)
{
	int i;
	if(pres>pree||ins>ine)
	{
		*t=NULL;
	}else
	{
		*t=(PTree)malloc(sizeof(BTree));
		(*t)->data=pre[pres];
		for(i=ins;i<=ine;i++)
		{
			if(in[i]==pre[pres])
			{
				preInCreateBTree1(&(*t)->lchild,pre,pres+1,pres+i-ins,in,ins,i-1);
				preInCreateBTree1(&(*t)->rchild,pre,pres+i-ins+1,pree,in,i+1,ine);
				break;
			}
		}
	}
}
//二叉排序树初始化
void insertBST(PTree *t,int c)
{
	PTree f,p;
	p=(*t);
//判定输入值存在的同时,找到数据插入的位置
	while(p!=NULL)
	{
		printf("p->data=%d\n",p->data);
		printf("c=%d\n",c);
		if(p->data==c)
		{
			printf("输入的值已经存在!\n");return;
		}
		f=p;
		//递归到最后p是一空值 f为其父节点
		p=(c<p->data)?p->lchild:p->rchild; 
	}
	p=(PTree)malloc(sizeof(BTree));
	p->data=c;
	p->lchild=NULL;p->rchild=NULL;//比较关键
	if(*t==NULL)
	{
		*t=p;
	}else
	{
		if(c<f->data)
		{
			f->lchild=p;
		}else
		{
			f->rchild=p;
		}
	}
}
void createBST(PTree *t)
{
	int d;
	scanf("%d",&d);
	if(d==-9999)return;
	do{
		insertBST(t,d);
	scanf("%d",&d);
	}while(d!=-9999);

}
/*二叉排序树*/
void BST(PTree *t)
{
	int c;
	PTree f,p;
	scanf("%d",&c);
	if(c==-9999)return;//判定输入
	do
	{
		//判定输入值存在的同时,找到数据插入的位置
		p=(*t);//归位
		while(p!=NULL)
		{
			if(p->data==c)
			{
				printf("输入的值已经存在!\n");return;
			}
			f=p;
		//递归到最后p是一空值 f为其父节点
			p=(c<p->data)?p->lchild:p->rchild; 
		}
		p=(PTree)malloc(sizeof(BTree));
		p->data=c;
		p->lchild=NULL;p->rchild=NULL;

		if(*t==NULL)
		{
			*t=p;
		}else
			{
				if(c<f->data)
				{
					f->lchild=p;
				}else
				{
					f->rchild=p;
				}
			}
		scanf("%d",&c);
	}while(c!=-9999);
}

//二叉树前序遍历
void preOrder(PTree t)
{
	if(t==NULL)return;
	printf("%c",t->data);
	preOrder(t->lchild);
	preOrder(t->rchild);
}
//二叉树中序遍历
void inOrder(PTree t)
{
	if(t==NULL)return;
	inOrder(t->lchild);
	printf("%c",t->data);
	inOrder(t->rchild);
}
//二叉树后序遍历
void postOrder(PTree t)
{
	if(t==NULL)return;
	postOrder(t->lchild);
	postOrder(t->rchild);
	printf("%c",t->data);
}
//求叶子节点数
int leafNum(PTree t)
{
	int l,r;
	if(!t)return 0;
	else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子
	else
	{
		l=leafNum(t->lchild);
		r=leafNum(t->rchild);
		return l+r;
	}
}

//求二叉树中叶子结点的个数
int nodeNum(PTree t)
{
	int l,r;
	if(t==NULL)return 0;//空树没有叶子节点
	else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子(只有一个根结点)
	else
	{
		l=nodeNum(t->lchild);
		r=nodeNum(t->rchild);
		return l+r+1;
	}
}
//求二叉树中度为2的结点数
int node2Num(PTree t)
{

	if(t==NULL)return 0;
	else
	{
		if(t->lchild&&t->rchild)return 1+node2Num(t->lchild)+node2Num(t->rchild);
		else
		{
			if(t->lchild&&!t->rchild)return node2Num(t->lchild);
			else return node2Num(t->rchild);
		}
	}
}


//度为1的结点数
int node1Num(PTree t)
{
	if(t==NULL)return 0;
	if((t->lchild!=NULL&&t->rchild==NULL)||(t->lchild==NULL&&t->rchild!=NULL))return 1;//判定度为1结点
	return node1Num(t->lchild)+node1Num(t->rchild);
}
//求高度(深度)根节点深度为1
int height(PTree t)
{
	int l,r;
	if(t==NULL)return 0;
	else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子
	else
	{
		l=height(t->lchild);
		r=height(t->rchild);
		return (l>r?l:r)+1;
	}
}
//交换二叉树的左右子树

void exchangeBtree(PTree t)
{
	PTree temp;
	if(t)
	{
		temp=t->lchild;
		t->lchild=t->rchild;
		t->rchild=temp;

		exchangeBtree(t->lchild);
		exchangeBtree(t->rchild);
	}
}


void main()
{

	PTree p=NULL;
	int i,l;
	char a[100],b[100];
//	前序中序输入测试
	printf("前序输入:\n");
	gets(a);
	l=strlen(a);
	levelCreateBTree(&p,a,0,l-1);
//	printf("中序输入:\n");
//	gets(b);
//	preInCreateBTree1(&p,a,0,strlen(a)-1,b,0,strlen(b)-1);*/
//	preCreateBTree(&p);
//	createBST(&p);
//	BST(&p);
	printf("层次输出:\n");
	levelOutputBtree(p,0);
/*	printf("前序输出:\n");
	preOrder(p); 
	printf("\n");
	printf("中序输出:");
	inOrder(p);
	printf("\n");
	printf("后续输出:");
	postOrder(p);
	printf("\n");
	printf("树的高度为:%d\n",height(p));
	printf("节点数为:%d\n",nodeNum(p));
	printf("度为1结点数:%d\n",node1Num(p));
	printf("度为2结点数:%d\n",node2Num(p));
	printf("叶子节点数为:%d\n",leafNum(p));
	exchangeBtree(p);
	printf("交换后后续输出:");
	postOrder(p);
*/
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics