UVA 122(二叉树的层次遍历 ,链式表示)

55 篇文章 0 订阅
17 篇文章 0 订阅

UVA 122

题意

就是给你给你一颗二叉树的每一个节点的大小,以及到达它的顺序。(可能重复给出节点,或者少给节点),让你输出二叉树的层次遍历。如果不能构成,输出not complete.例如:
Sample Input 在这里插入图片描述
(11,LL) (7,LLL) (8,R)
(5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
Sample Output
5 4 8 11 13 4 7 2 1
not complete

分析
  • 先按照题目给出的节点建树,空节点也要建,只不过不赋值
  • 然后利用bfs层次遍历输出顺序
  • 重点,在建树的时候判断是否重复给节点,在遍历的时候判断是否少了节点。 利用全局变量failed判断。
下述代码二叉树采用链式表示,有详细注释

注意sscanf的运用

#include<bits/stdc++.h>
using namespace std;
const int N = 256 + 10;

struct node{
	bool flag;				//是否被赋值过
	int v;					//节点的值
	node *left, *right;
	node():flag(false), left(NULL), right(NULL){}  //构造函数
}*root;				//根节点

node *newnode() { return new node(); }		//申请节点

bool failed;		//重复赋值标记

void free(node *u)
{
	if(u == NULL)
		return;
	free(u->left);
	free(u->right);
	delete u;
}
void add(int v, char* s)			//v >>> 节点数;s >>> 节点顺序
{
	node *u = root;				//从根节点往下走
	int n = strlen(s);
	for (int i = 0; i < n; i++){
		if(s[i] == 'L'){
			if(u->left == NULL)			//节点不存在,建立新节点
				u->left = newnode();	
			u = u->left;				//往左走
		}else if(s[i] == 'R'){
			if(u->right == NULL)
				u->right = newnode();
			u = u->right;
		}
	}
	if(u->flag)
		failed = true;		//某个节点重复给出,做标记,输出-1
	u->v = v;				//赋值
	u->flag = true;			//标记有值
}

bool bfs(vector<int>& ans)		//传地址,即本身
{
	queue<node *> q;
	ans.clear();				
	q.push(root);				//初始化
	while(!q.empty()){
		node *u = q.front();
		q.pop();
		if(!u->flag)
			return false;		//有节点没被赋值,直接返回
		ans.push_back(u->v);
		if(u->left)			//把左右节点放入队列(如果有的话)
			q.push(u->left);
		if(u->right)
			q.push(u->right);
	}
	return true;		//输入没有少值的,正确
}

bool input()
{
	failed = false;
	free(root);						//释放上一颗树的内存
	root = newnode();
	char s[N];
	while(1){
		if(scanf("%s", s) != 1)	
			return false;			//整个输入部分结束
		if(!strcmp(s, "()"))
			break;					//一颗树读入结束
		int v;
		sscanf(&s[1], "%d", &v);	//读入括号里的数,&s[1]代表从第二个字符后面的字符串
		add(v, strchr(s, ',') + 1); // strchr(s, ',') + 1代表逗号后面的字符串
	}
	return true;
}

int main()
{
	vector<int> ans;			//存放节点编号
	while(input()){				//每次输入一棵树
		if(!bfs(ans))
			failed = true;
		if(failed)
			printf("not complete\n");
		else{
			for (int i = 0; i < ans.size(); i++){
				printf("%d%c", ans[i], " \n"[i==(ans.size()-1)]);
			}
		}
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值