实验题7.1: 编写一个程序algo7-1.cpp,实现二叉树的各种基本运算,并在此基础上设计一个程序Main.cpp完成如下功能(b为如下图所示的一棵二叉树)

#include 
   
   
    
    
#include 
    
    
     
     
#define MaxSize 50
typedef char Elemtype;
typedef struct node
{
	Elemtype data;
	struct node * lchild;
	struct node * rchild;
}BTNode;
void CreateBTNode(BTNode *& b, char * str)
{
	BTNode * St[MaxSize], *p;
	int top = -1, k, j = 0;
	char ch;
	b = 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 (b == NULL)
				b = p;
			else
			{
				switch (k)
				{
				case 1:St[top]->lchild = p; break;
				case 2:St[top]->rchild = p; break;
				}
			}
		}
		j++;
		ch = str[j];
	}

}
BTNode *FindNode(BTNode *b, Elemtype x)
{
	BTNode *p;
	if (b == NULL)
		return NULL;
	else if (b->data == x)
		return b;
	else
	{
		p = FindNode(b->lchild, x);
		if (p != NULL)
			return p;
		else
			return FindNode(b->rchild, x);
	}
}
 BTNode *LchildNode(BTNode *p)
{
	return p->lchild;
}
 BTNode *RchildNode(BTNode *p)
{
	return p->rchild;
}
int BTNodeHeight(BTNode *b)
{
	int lchildh, rchildh;
	if (b == NULL)
		return 0;
	else
	{
		lchildh = BTNodeHeight(b->lchild);
		rchildh = BTNodeHeight(b->rchild);
		return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1);
	}
}
void DispBTNode(BTNode *b)
{
	if (b != NULL)
	{
		printf("%c", b->data);
		if (b->lchild != NULL || b->rchild != NULL)
		{
			printf("(");
			DispBTNode(b->lchild);
			if (b->rchild != NULL)
				printf(",");
			DispBTNode(b->rchild);
			printf(")");
		}
	}
}
int Leave(BTNode *b)
{
	if (b == NULL)
		return 0;
	else
	{
		if (b->lchild == NULL && b->rchild == NULL)
			return 1;
		else
			return(Leave(b->lchild) + Leave(b->rchild));
	}
}
int Amout(BTNode *b)
{
	int L = 0;
	int R = 0;
	if (b == NULL)
		return 0;
	else
	{
		L = Amout(b->lchild);
		R = Amout(b->rchild);
		return (L + R + 1);
	}
}
int BTNodeWidth(BTNode *b)        //求二叉树b的宽度
{
	struct
	{
		int floors;                 //节点的层次编号
		BTNode *p;					//节点指针
	}Qu[MaxSize];					//定义顺序非循环队列	
	int front, rear;					//定义队首和队尾
	int num, max, i, n;
	front = rear = 0;					//初始化队列,是队列为空
	if (b != NULL)
	{
		rear++;
		Qu[rear].p = b;					//根节点指针入队
		Qu[rear].floors = 1;			//根节点的层次编号为1
		while (rear != front)
		{
			front++;
			b = Qu[front].p;            //队头出队
			num = Qu[front].floors;
			if (b->lchild != NULL)      //若左子树不为空,则入队
			{
				rear++;
				Qu[rear].p = b->lchild;
				Qu[rear].floors = num + 1;
			}
			if (b->rchild != NULL)      //若右子树不为空,则入队
			{
				rear++;
				Qu[rear].p = b->rchild;
				Qu[rear].floors = num + 1;
			}
		}
		max = 0; num = 1; i = 1;
		while (i <= rear)
		{
			n = 0;
			while (i <= rear && Qu[i].floors == num)
			{
				n++; i++;
			}
			num = Qu[i].floors;
			if (n > max) max = n;
		}
		return max;
	}
	else
		return 0;
}
void main()
{
	BTNode *b, *p, *lp, *rp;
	printf("实验题7.1: 编写一个程序algo7-1.cpp,实现二叉树的各种基本运算,并在此基础上设计一个程序Main.cpp完成如下功能(b为如下图所示的一棵二叉树)\n(1)输出二叉树b;\n(2)输出H节点的左、右孩子节点值;\n(3)输出二叉树b的深度;\n(4)输出二叉树b的宽度;\n(5)输出二叉树b的节点个数;\n(6)输出二叉树b的叶子节点个数。\n                b\n              ↙\n             A\n          ╱   ╲\n         B       C\n       ╱ ╲   ╱ ╲\n      D     E F     G\n          ╱         ╲\n         H             I\n       ╱ ╲\n      J     K\n             ╲\n               N\n");
	CreateBTNode(b, "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
	printf("二叉树的基本运算如下:\n");
	printf("(1)输出二叉树:");
	DispBTNode(b);
	printf("\n");
	printf("(2)H节点:");
	p = FindNode(b, 'H');
	if (p != NULL)
	{
		lp = LchildNode(p);
		if (lp != NULL)
			printf("左孩子为%c ", lp->data);
		else  printf("无左孩子");
		rp = RchildNode(p);
		if (rp != NULL)
			printf("右孩子为%c", rp->data);
		else  printf("无右孩子");
	}
	printf("\n");
	printf("(3)二叉树b的深度:%d\n", BTNodeHeight(b));
	printf("(4)输出二叉树b的宽度为:%3d\n", BTNodeWidth(b));
	printf("(5)二叉树b的节点个数:%d\n", Amout(b));
	printf("(6)二叉树b的叶子节点个数:%d\n", Leave(b));

	system("pause");
}

    
    
   
   
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值