栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

洛谷P1087 [NOIP2004 普及组] FBI 树c语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

洛谷P1087 [NOIP2004 普及组] FBI 树c语言

洛谷P1087 [NOIP2004 普及组] FBI 树

二叉树的后序遍历

文章目录
  • 思想
  • 代码

思想

[1] 二叉树:二叉树是结点的有限集合,这个集合或为空集,或由一个根结点和两棵不相交的二叉树组成。这两棵不相交的二叉树分别称为这个根结点的左子树和右子树。
  [2] 后序遍历:后序遍历是深度优先遍历二叉树的一种方法,它的递归定义是:先后序遍历左子树,再后序遍历右子树,最后访问根。

注释:本题就是用到了二叉树。解题时思路清晰、目的明确就好了,主要分以下几个步骤:
1、以字符串的形式录入原始串s;
2、按题意求欲设的01串的长度:pow(2,n);
3、将字符串s转换为01串:全0为B,全1为I,混合串为F;
4、递归创建二叉树;
5、后序遍历二叉树并输出。

代码
#include
#include
#include
#include
#define max 10000
int num[max];
char s[max];

//定义结构体
struct Node{
	Node *left,*right;
	char c;
};

//将字符数组转为整型数组 
void strtoint(char *s,int *num,int len)
{
	int i = 0;
	for(i = 0; i < len ; i++)
	{
		num[i] = s[i] - '0';
	}
}

//后序遍历:递归遍历左右子树 
void lastdfs(Node *head)
{
	if(head->left)
		lastdfs(head->left);
	if(head->right)
		lastdfs(head->right);
	printf("%c",head->c);
}

//判断并返回01串是否为全0,全1,混合串 
char FBI(int *num,int begin,int end)
{
	int sum = 0;
	int i;
	for(i = begin;i <= end; i++)
	{
		sum += num[i];
	}
	if(sum == 0) return'B';
	else if(sum == end - begin + 1) return 'I';
	else return 'F';	
}

//创建二叉树 
Node *buildtree(int *num, int begin, int end)
{
	//char c = FBI(num,begin,end);
	Node *p = (Node*)malloc(sizeof(Node));
	//p->c = c;
	if(begin < end)//说明子串不为空 
	{
		int mid = (begin + end) / 2;
		p->left = buildtree(num,begin,mid);
		p->right = buildtree(num,mid + 1,end);
	}
	else{
		//若子串为空,左右子树赋NULL 
		p->left = NULL;
		p->right = NULL;
	}
	return p;
}

int main()
{
	int n;
	scanf("%d",&n);
	getchar();//处理回车 
	scanf("%s",s);
	int len = pow(2,n);//01串的长度为2的n次方 
	strtoint(s,num,len);
	Node *head = buildtree(num,0,len - 1);
	lastdfs(head);
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836010.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号