6-3-2 二叉树层次遍历(BFS)

本文详细记录了在实现算法竞赛题目过程中遇到的一个特殊问题:如何正确解析和构建二叉树结构。通过分析《算法竞赛入门经典》一书中的示例代码,发现了其在输入解析上的不足,并提出了一种改进方案,采用递归方式来处理输入,最终成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//做这题的时候真是把我纠结死,最后发现是《算法竞赛入门经典》的作者的代码有问题,特别是sscanf(&s[1],"%d",&x);addnode(v,strchr(s,',')+1);这2个语句不能直接读取"11,LL)"以及"LL)",而是把整个接受到的字符串都读取了,最后我对AddNode()做了递归运算才解决了这个问题。
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

#define MAXN 256
char s[MAXN+10];
int failed=0;
int n=0,ans[MAXN];
typedef struct TNode
{
	int Have_Value;
	int v; 
	struct TNode *Left,*Right;
}Node;

Node* root;

Node* NewNode()
{
	Node* u=(Node*)malloc(sizeof(Node));
	if(u!=NULL)
	{
		u->Have_Value=0;
		u->Left=u->Right=NULL;
	}
	return u;
}

void AddNode(int v,char* s)
{
	int n=strlen(s);
	int i;
	Node* u=root;
	for(i=0;i<n;i++)
	{
		if('('==s[i])
		{
			break;
		}
		if('L'==s[i])
		{
			if(NULL==u->Left)
			{
				u->Left=NewNode();
			}
			u=u->Left;
		}
		else if('R'==s[i])
		{
			if(NULL==u->Right)
			{
				u->Right=NewNode();
			}
			u=u->Right;
		}
	}
	if(u->Have_Value)
	{
		failed=1;
		return;
	}
	u->v=v;
	u->Have_Value=1;
	
	if(('('==s[i])&&(strcmp(&s[i],"()")!=0))
	{
		sscanf(&s[i+1],"%d",&v);
	}
	else
	{
		return;
	}
	AddNode(v,strchr(&s[i],',')+1);
}

void RemoveTree(Node* u)
{
	if(NULL==u)
	{
		return;
	}
	RemoveTree(u->Left);
	RemoveTree(u->Right);
	free(u);
}

int BFS()
{
	int front=0,rear=1;
	Node* q[MAXN];
	q[0]=root;
	while(front<rear)
	{
		Node* u=q[front++];
		if(!u->Have_Value)
		{
			return 0;
		}
		ans[n++]=u->v;
		if(u->Left!=NULL)
		{
			q[rear++]=u->Left;
		}
		if(u->Right!=NULL)
		{
			q[rear++]=u->Right;
		}
	}
	return 1;
}

int Read_Input()
{
	root=NewNode();
	
	while(1==scanf("%s",s))
	{
		failed=0;
		if(!strcmp(s,"()"))
		{
			break;
		}
		int v;
		if((s[1]>='0')&&(s[1]<='9'))
		{
			sscanf(&s[1],"%d",&v);
		}
		else
		{
			break;
		}
		AddNode(v,strchr(s,',')+1);
		if(failed)
		{
			return 0;
		}
	}
	return 1;
}

int main()
{
	Read_Input();
	BFS();
	RemoveTree(root);
	for(int i=0;i<n;i++)
	{
		printf("%d ",ans[i]);
	}
	printf("\n");
	if(failed)
	{
		printf("-1");
	}
	printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值