UVa 122 Trees on the level 建立二叉树BFS层序遍历





#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>

using namespace std;

const int maxn = 256 + 10;
char s[maxn];

struct node {
	int d;
	bool has_v;
	node *left, *right;
	node() : d(0), left(NULL), right(NULL), has_v(false) {}
};

node *root;
vector<int> ans;

bool bfs() {
	queue<node*> Q;
	Q.push(root);
	while (!Q.empty()) {
		node* tn = Q.front(); Q.pop();
		if (!tn->has_v) return false; //发现树上有断点
		ans.push_back(tn->d);
		if (tn->left != NULL) Q.push(tn->left);
		if (tn->right != NULL) Q.push(tn->right);
	}
	return true;
}

bool addnode(int v, char *s) {
	node *u = root;
	while (*s != ')') {
		if (*s == 'L') {
			if (u->left == NULL) u->left = new node();
			u = u->left;
		}
		else if (*s == 'R') {
			if (u->right == NULL) u->right = new node();
			u = u->right;
		}
		s++;
	}
	if (u->has_v) return false;
	u->has_v = true;
	u->d = v;
	return true;
}

void Del_tree(node *root) {
	if (root == NULL) return;
	Del_tree(root->left);
	Del_tree(root->right);
	delete root;
}

int main()
{
	int v;
	bool flag = true;
	root = new node();
	ans.clear();
	while (~scanf("%s", s)) {
		if (strcmp(s, "()")) {
			sscanf(&s[1], "%d", &v); //解析输入数字到v
			if (flag) //如果上次addnode有问题那么以后就没必要做了
				flag = addnode(v, strchr(s, ',') + 1);
		}
		else {
			if (!flag || !bfs()) {
				printf("not complete\n");
			}
			else { //此时flag == true && bfs() == true
				int cnt = 0;
				for (vector<int>::iterator i = ans.begin(); i != ans.end(); i++) {
					if (!cnt)
						printf("%d", *i);
					else
						printf(" %d", *i);
					cnt++;
				}
				puts("");
			}
			Del_tree(root); //将树删除

			//为下次的新树初始化
			flag = true;
			ans.clear();
			root = new node();
		}
	}
	delete root;
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值