例题6-7 树的层次遍历 UVa122

1.题目描述:点击打开链接

2.解题思路:本题是训练二叉树的一道好题。首先要解决读数据问题,根据题意,当输入为“()”时,结束该组数据读入,当没有字符串时,整个输入结束。因此可以专门编写一个readin()函数,类型设置为bool型,遇到第一种情况时返回true,遇到第二种情况返回false,主程序中只要发现readin返回false时就break,结束整个大循环。

接下来要建立二叉树,首先为二叉树编写一个结构体,然后根据字符串的输入情况来建树,如果是‘L’就往左走,走不动时建一颗新树,同样的方法处理右子树,最后读入结点值。由于输入可能有误,因此用一个全局变量failed来记录是否有输入错误的情况出现,如果在建树过程中发现该结点已经被赋过值,那么全局变量failed变为true。

最后开始BFS找结点值,此时可能出现有结点没有结点值的情况,因此要把bfs定义为bool型,只要出现这种非法情况,返回false。最后便不难根据情况进行输出了。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

#define N 256+10
char s[N];
struct Node
{
	int v;
	bool have_value;
	Node*left, *right;
	Node() :have_value(false), left(NULL), right(NULL){}
};
Node*root;//根结点,使用前要申请空间
bool failed;//记录输入是否有误
Node*newnode(){ return new Node(); }
void addnode(int v, char*s)
{
	int n = strlen(s);
	Node*u = root;
	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->have_value)failed = true;//已经赋过值了,说明输入有误
	u->v = v;
	u->have_value = true;//标记为已经赋值
}
bool readin()//读数据
{
	failed = false;
	for (;;)
	{
		if (scanf("%s", s)!=1)return false;//整个输入结束
		if (!strcmp(s, "()"))break;//读到结束标志,退出循环
		int v;
		sscanf(&s[1], "%d", &v);//读入结点值
		addnode(v, strchr(s, ',') + 1);//查找逗号,然后插入结点
	}
	return true;
}
bool bfs(vector<int>&ans)//利用bfs进行遍历,并将结点值放入vector中
{
	queue<Node*>q;
	ans.clear();
	q.push(root);
	while (!q.empty())
	{
		Node*u = q.front(); q.pop();
		if (!u->have_value)return false;//没有结点值,返回false
		ans.push_back(u->v);
		if (u->left != NULL)q.push(u->left);
		if (u->right != NULL)q.push(u->right);
	}
	return true;
}
int main()
{
	//freopen("t.txt", "r", stdin);
	while(1)
	{
		root = newnode();
		if (!readin())break;
		vector<int>ans;
		if (!failed&&bfs(ans))
		{
			int len = ans.size();
			for (int i = 0; i < len; i++)
				printf("%d%c", ans[i], i == len - 1 ? '\n' : ' ');
		}
		else puts("not complete");
	}
	return 0;
}
时间: 2024-10-13 05:52:00

例题6-7 树的层次遍历 UVa122的相关文章

紫书例题6-7 树的层次遍历

纯小白也能看懂的代码,一起努力 6.3.2 二叉树的层次遍历 例题6-7 树的层次遍历(Trees on the level, Duke 1993, UVa 122) 输入一棵二叉树,你的任务是按从上到下.从左到右的顺序输出各个结点的值.每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右).在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开.每棵树的输入用一对空括号"()"结束(这对括号本身不代表一个结点),如图6-3所示 注意,如果从根到某个叶结点的

6-7 树的层次遍历 uva122

非常不熟练  照着书大的 晚上尝试一下自己打  了解二叉树  用数组打 第一次: #include<bits/stdc++.h> using namespace std; bool failed; void addnode(int v,char *s); char s[1000]; struct node { bool flag; int v; node *left,*right; node():flag(false),left(NULL),right(NULL){} }; node *roo

数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。

按先序遍历创建一棵树,以层次遍历输出 样例输入 A B # D # # C E # # F # # 样例输出 LevelOrder: A B C D E F 代码: #include <iostream> #include <queue> using namespace std; struct node { //表示一个树上的节点 char ch; node *left, *right; }; node* creat() { //以递归的方式构造一棵二叉树 node *root =

树的层次遍历(Java代码实现)

与树的前中后序遍历的DFS思想不同,层次遍历用到的是BFS思想.一般DFS用递归去实现(也可以用栈实现),BFS需要用队列去实现. 层次遍历的步骤是: 1.对于不为空的结点,先把该结点加入到队列中 2.从队中拿出结点,如果该结点的左右结点不为空,就分别把左右结点加入到队列中 3.重复以上操作直到队列为空 1 public class Solution{ 2 class TreeNode { 3 int val; 4 TreeNode left; 5 TreeNode right; 6 TreeN

树的层次遍历(Trees on the level,UVA 122)

题目描述: 题目思路: 1.用结构链表来建树 2.用队列来实现层次遍历,当遍历到根节点时,将其子节点压入队列 #include <iostream> #include <cstdlib> #include <cstring> #include <vector> #include <queue> using namespace std; //树结点 struct Node{ int v ; Node* left,*right ; int have_

1127 ZigZagging on a Tree (30 分)树的层次遍历

1127 ZigZagging on a Tree (30 分) Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to pr

树——通用树的层次遍历

1,为何及如何按层次遍历通用树中的每一个数据元素? 1,通用树结构是一种容器类型的树结构,其用来装数据元素,所以应该提供一种方法来遍历树中的每一个数据结构: 2,往下分析: 2,当前的事实: 1,树是非线性的数据结构,树的结点没有固定的编号方式: 1,也就不能像链表一样统一编号来访问: 3,新的需求: 1,为通用树结构提供新的方法,快速遍历每一个结点: 4,设计思路(游标): 1,在树中定义一个游标(GTreeNode<T>*): 2,遍历开始前将游标指向根结点(root()): 3,获取游标

uva-122 树的层次遍历

题意概要:输入二叉树的每一个节点的信息,建树完毕后,按照层次顺序遍历这棵树,然后将每一个节点的权值给输出来! 注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出或者给出超过一次, 应该输出"not complete".节点数不超过256个! 代码如下:(代码中有详细的注释!)此份代码用时为 9ms ! #include<iostream> #include<cstdio> #include<vector> #include<queue&

例题6-7 树的层次遍历

Trees on the level Trees are fundamental in many branches of computer science (Pun definitely intended). Current stateof-the art parallel computers such as Thinking Machines' CM-5 are based on fat trees. Quad- and octal-trees are fundamental to many