uva-122 树的层次遍历

题意概要:输入二叉树的每一个节点的信息,建树完毕后,按照层次顺序遍历这棵树,然后将每一个节点的权值给输出来!

注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出或者给出超过一次,

应该输出“not complete”.节点数不超过256个!

代码如下:(代码中有详细的注释!)此份代码用时为
9ms

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=52014;
char str[maxn];
bool failed=false;
vector<int>ans;
struct Node//节点结构体!
{
    bool have_value;
    int value;
    Node *left,*right;
    Node():have_value(false),value(0),left(NULL),right(NULL) {}
};
struct Node *root;//建立根节点!
void remove_tree(Node *now)//将树所占用的内存释放掉!
{
    if(now==NULL)
        return ;
    remove_tree(now->left);
    remove_tree(now->right);
    delete now;
}
Node *newnode()//建立新节点!
{
    return new Node();
}
void addnode(int num,char *s)//增加节点,同时赋值!
{
    int len=strlen(s);
    Node *now=root;
    for(int i=0; i<len; i++)
    {
        if(s[i]=='L')
        {
            if(now->left==NULL)
                now->left=newnode();//建立心新节点!
            now=now->left;
        }
        else if(s[i]=='R')
        {
            if(now->right==NULL)
                now->right=newnode();//建立新节点!
            now=now->right;
        }
    }
    if(now->have_value)failed=true;//如果该节点已经赋值了,那么表示输入有误!
    now->value=num;//给节点赋值!
    now->have_value=true;//标记该节点已经赋值了!
}
bool input()//将树j节点的信息给输入!
{
    failed=false;
    root=newnode();
    while(1)
    {
        if(scanf("%s",str)!=1)return false;//错误输入
        if(!strcmp(str,"()"))break;//结束输入!
        int num;//对于字符串“(11,,LL)”来说,
        sscanf(&str[1],"%d",&num);//此操作是取出节点权值【11】!
        addnode(num,strchr(str,',')+1);//strchr(str,',')函数是
        //返回字符串str中从左到右第一个字符‘,’的指针,因此strchr(str,',')+1所对应的字符串就是"LL)".
    }
    return true;
}
bool bfs()
{
    queue<Node*>Q;//建立队列!
    Q.push(root);
    ans.clear();//将容器初始化!
    while(!Q.empty())
    {
        Node *now=Q.front();
        Q.pop();
        if(!now->have_value)
            return false;//如果这个节点的值还没有的话,那么表示输入有误!
        ans.push_back(now->value);//将值存进容器!
        if(now->left!=NULL)
            Q.push(now->left);
        if(now->right!=NULL)
            Q.push(now->right);
    }
    return true;
}
void print()
{
    for(int i=0; i<ans.size(); i++)
        printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
    return ;
}
int main()
{
    while(input())
    {
        if(failed)
        {
            cout<<"not complete"<<endl;
            continue;
        }
        if(bfs())
            print();
        else
            cout<<"not complete"<<endl;
        remove_tree(root);
    }
    return 0;
}
时间: 2024-11-13 17:37:56

uva-122 树的层次遍历的相关文章

Uva 122 树的层次遍历 Trees on the level lrj白书 p149

是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担这样的工作 然后遍历二叉树,读取结点编号输出bfs() 这道题有内存池应用的背景 附链接  http://blog.csdn.net/shawngucas/article/details/6574863 #include <cstdio> #include <cstring> #inc

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

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

数据结构:树的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 =

树的层次遍历(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_

树的层次遍历(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

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,获取游标

例题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

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

1.题目描述:点击打开链接 2.解题思路:本题是训练二叉树的一道好题.首先要解决读数据问题,根据题意,当输入为"()"时,结束该组数据读入,当没有字符串时,整个输入结束.因此可以专门编写一个readin()函数,类型设置为bool型,遇到第一种情况时返回true,遇到第二种情况返回false,主程序中只要发现readin返回false时就break,结束整个大循环. 接下来要建立二叉树,首先为二叉树编写一个结构体,然后根据字符串的输入情况来建树,如果是'L'就往左走,走不动时建一颗新树