数据结构实验六树和二叉树

exp6-1.cpp

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string>
#define MaxSize 100
typedef char ElemType; 
typedef struct tnode
{
	ElemType data;
	struct tnode *lchild,*rchild;
} BTNode;
void CreateBTree(BTNode *&bt,char *str)
{
	BTNode *St[MaxSize],*p=NULL;
	int top=-1,k,j=0;
	char ch;
	bt=NULL;
	ch=str[j];
	while (ch!='\0')
	{
		switch(ch)
		{
			case '(':top++;St[top]=p;k=1;break;
			case ')':top--;break;
			case ',':k=2;break;
			default:p=(BTNode *)malloc(sizeof(BTNode));
				p->data=ch;p->lchild=p->rchild=NULL;
				if (bt==NULL)
					bt=p;
				else
				{
					switch(k)
					{
						case 1:St[top]->lchild=p;break;
						case 2:St[top]->rchild=p;break;
					}
				}
		}
		j++;
		ch=str[j];
	}
}
void DestroyBTree(BTNode *&bt)
{
	if (bt!=NULL)
	{
		DestroyBTree(bt->lchild);
		DestroyBTree(bt->rchild);
		free(bt);
	}
}
int BTHeight(BTNode *bt)
{
	int lchilddep,rchilddep;
	if (bt==NULL) return(0);
	else
	{
		lchilddep=BTHeight(bt->lchild);
		rchilddep=BTHeight(bt->rchild);
		return (lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1); 
	}
}
int NodeCount(BTNode *bt)
{
	int num1,num2;
	if (bt==NULL) return 0;
	else
	{
		num1=NodeCount(bt->lchild);
		num2=NodeCount(bt->rchild);
		return (num1+num2+1);
	}
}
int LeafCount(BTNode *bt)
{
	int num1,num2;
	if (bt==NULL) return 0;
	else if (bt->lchild==NULL && bt->rchild==NULL) return 1;
	{
		num1=LeafCount(bt->lchild);
		num2=LeafCount(bt->rchild);
		return (num1+num2);
	}
}
void DispBTree(BTNode *bt)
{
	if (bt!=NULL)
	{
		printf("%c",bt->data);
		if (bt->lchild!=NULL || bt->rchild!=NULL)
		{
			printf("(");
			DispBTree(bt->lchild);
			if (bt->rchild!=NULL)
				printf(",");
			DispBTree(bt->rchild);
			printf(")");
		}
	}
}
void PreOrder(BTNode *bt)
{
	if (bt!=NULL)
	{
		printf("%c",bt->data);
		PreOrder(bt->lchild);
		PreOrder(bt->rchild);
	 } 
}
void InOrder(BTNode *bt)
{
	if (bt!=NULL)
	{
		InOrder(bt->lchild);
		printf("%c",bt->data);
		InOrder(bt->rchild);
	}
}
void PostOrder(BTNode *bt)
{
	if (bt!=NULL)
	{
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
		printf("%c",bt->data);
	}
}
void LevelOrder(BTNode *bt)
{
	BTNode *p;
	BTNode *qu[MaxSize];
	int front,rear;
	front=rear=0;
	rear++;qu[rear]=bt;
	while (front!=rear)
	{
		front=(front+1)%MaxSize;
		p=qu[front];
		printf("%c",p->data);
		if (p->lchild!=NULL)
		{
			rear=(rear+1)%MaxSize;
			qu[rear]=p->lchild;
			
		}
		if (p->rchild!=NULL)
		{
			rear=(rear+1)%MaxSize;
			qu[rear]=p->rchild;
		}
	}
}
int main()
{
	BTNode *bt;
	CreateBTree(bt,"A(B(D,E(G,H)),C(,F(K)))");
	printf("二叉树bt:");DispBTree(bt);printf("\n");
	printf("bt的高度:%d\n",BTHeight(bt));
	printf("bt的结点数:%d\n",NodeCount(bt));
	printf("bt的叶子结点数:%d\n",LeafCount(bt));
	printf("bt的先序遍历序列:");PreOrder(bt);printf("\n");
	printf("bt的中序遍历序列:");InOrder(bt);printf("\n");
	printf("bt的后序遍历序列:");PostOrder(bt);printf("\n");
	printf("bt的层次遍历序列:");LevelOrder(bt);printf("\n");
	DestroyBTree(bt);
}

运行结果截图:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值