数据结构 二叉树各种基本运算的实现

数据结构 二叉树各种基本运算的实现

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100;
int Width[10] = { 0 };
int yezi = 0;
typedef struct node
{
	char data;
	struct node *lchild;
	struct node *rchild;
}BTNode;

void CreateBTNode(BTNode *&b, char *str)  //创建二叉树
{
	BTNode *St[100], *p;
	int top = -1, k, j = 0;
	char ch;
	b = NULL;              //创建二叉树初始为空
	ch = str[j];
	while (ch != '\0')     //循环扫描str中每个字符
	{
		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;      //*p为二叉树的根节点
			else            //若已建立二叉树根节点
			{
				switch (k)
				{
				case 1:St[top]->lchild = p; break;
				case 2:St[top]->rchild = p; break;
				}
			}
		}
		j++;
		ch = str[j];
	}
}
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(")");                            //有孩子节点才输出")"
		}
	}
}
BTNode *FindNode(BTNode *b, char x)   //查找节点
{
	BTNode *p;
	if (b == NULL)           //若此时的节点为空返回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);  
	}
}
int BTNodeHeight(BTNode * b)  //求二叉树的高度(即深度)
{
	int lchildd, rchildd; 
	if (b == NULL)            //空树的高度为0
		return(0);
	else
	{
		lchildd = BTNodeHeight(b->lchild);   //求左子树的高度为lchildh
		rchildd = BTNodeHeight(b->rchild);   //求右子树的高度为rchildh
		return(lchildd > rchildd) ? (lchildd + 1) : (rchildd + 1);   //三目运算符返回更深的子树深度
	}
}
int WidthofBTNode(BTNode * b, int floor)  //求每一层二叉树的宽度
{
	if (b != NULL)
	{
		Width[floor]++;       //若该节点不为空,该层节点数+1
		WidthofBTNode(b->lchild, floor + 1);  //递归处理左子树
		WidthofBTNode(b->rchild, floor + 1);  //递归处理右子树
	}
	else
		return 0;
}
int Elemnumber(BTNode * b)   //求二叉树的节点个数
{
	int lchildd, rchildd;    
	if (b == NULL)      //若该节点为空,返回0
		return 0;
	else
	{
		lchildd = Elemnumber(b->lchild);   //递归处理左子树
		rchildd = Elemnumber(b->rchild);   //递归处理右子树
		return(lchildd + rchildd + 1);     //返回所有的左、右孩子节点个数加根节点个数(即所有节点个数)
	}
}
int Yezinumber(BTNode * b)   //求叶子节点个数
{
	if (b != NULL)
	{
		if ((b->lchild&&b->rchild) != NULL)   //若左右孩子节点都不为空递归处理左右子树叶子节点个数之和
			return (Yezinumber(b->lchild) + Yezinumber(b->rchild)); 
		else                                   //其他情况
			return (Yezinumber((b->lchild > b->rchild) ? (b->lchild) : (b->rchild))); 
	}
	else
		return 1;
}

int main()
{
	int n;         
	int max = 0;
	BTNode *tree;   //设置头节点
	char s[100] = "A(B(D,E(,H(J,K(L,M(,N))))),C(F,G(,I)))";   //二叉树的值
	BTNode *Elem;  //用于从子函数中传递指针
	char *p;    
	p = s;         //设置子函数传递字符指针
	CreateBTNode(tree, p);
	printf("\n二叉树为:\n");
	DispBTNode(tree);
	printf(" \n");
	Elem = FindNode(tree, 'H');
	printf(" \n\n");
	printf("H参数的左右节点的值分别为:%3c%3c\n\n", Elem->lchild->data, Elem->rchild->data);
	n = BTNodeHeight(tree);
	printf("二叉树的深度为:%3d\n\n", n);
	WidthofBTNode(tree, 1);
	for (n = 1; n <= BTNodeHeight(tree); n++)   //循环比较宽度最大的二叉树层即为二叉树的宽度
		if (max<Width[n])
			max = Width[n];
	printf("二叉树的宽度为:%3d\n\n", max);
	n = Elemnumber(tree);
	printf("二叉树的所有节点数:%3d\n\n", n);
	n = Yezinumber(tree);
	printf("所有叶子节点个数:%3d\n\n", n);
	return 0;
}
  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值