UVA-122 Trees on the level

思路(反思):

1. 读取串 拆分创建树(最后别忘记释放内存(我偷懒了))

2. 利用队列 实现树的层序遍历:根进队 队为空退出 否则出队 输出data域 并将出对元素的左右结点(如果有)依次入队

3. 两种情况为 "not complete" 其一 树的某结点(未被赋值)为空 其二 某结点被多次赋值(不论是否相等)

4. 注意输出格式 最后一个结点数据后无空格

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <sstream>
using namespace std;
class TNode
{
public:
	bool empty;	// 记录是否被赋值过
	TNode* l, *r;
	int data;
public:	// 初始化
	TNode(bool a = true, TNode*b = NULL, TNode *c = NULL) :empty(a), l(b), r(c){}
};
int f = 0;	// 记录有无某点被多次赋值
int main()
{
	char str[1000];
	while (1)
	{
		TNode * T = new TNode();
		f = 0;
		while (1)
		{
			if (scanf("%s", str) == -1)return 0;// 用scanf 返回-1 结束程序
			string s(str);
			if (s == "()"){ break; }
			string dig = s.substr(1, s.find(",") - 1);// 拆分string
			stringstream ssm(dig);// 字符串流
			int t = 0;
			ssm >> t;
			int e = s.find(")");
			TNode *p = T;
			for (int i = s.find(","); i < e; i++)
			{
				if (s[i] == 'L'){ if (p->l == NULL)p->l = new TNode(); p = p->l; }
				else if (s[i] == 'R'){ if (p->r == NULL)p->r = new TNode(); p = p->r; }
			}
			if (p->empty){ p->data = t; p->empty = false; }
			else f = 1;
		}
		queue<TNode*> qTN;	//用结点的指针队列 实现(树)层序遍历
		qTN.push(T);
		if (f)
		{
			cout << "not complete" << endl; continue;
		}
		while (qTN.empty() == false)
		{
			TNode *p = qTN.front();
			if (p->empty == true){ cout << "not complete" ; break; }
			if(p==T)cout << p->data;
			else cout << " "<< p->data ;
			qTN.pop();
			if (p->l)qTN.push(p->l);
			if (p->r)qTN.push(p->r);
		}
		cout << endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值