树的层次遍历(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_value ;
    Node():have_value(false),left(NULL),right(NULL){} ;
} ;

Node* root ;//根节点

Node* newnode(){
    return new Node() ; //返回一个新结点
} 

bool failed ;

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;
} 

void freetree(Node* u){ //释放内存
    if(u == NULL) return ;
    freetree(u->left);
    freetree(u->right);
    delete u;
}

char s[1005];
bool read_input(){
    failed = false ;
    freetree(root) ;
    root = newnode();
    while(true){
        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){//搜索
    queue<Node*> q;
    ans.clear();
    q.push(root);
    while(!q.empty()){
        Node *u = q.front();q.pop();
        if(!u->have_value) return 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(int argc, char *argv[])
{
    vector<int> ans;
    while(read_input()){
        if(!bfs(ans)) failed = 1;
        if(failed) printf("not complete\n");
        else{
            for(int i = 0;i < ans.size();i++)
            {
                if(i != 0) cout << " " ;
                   cout << ans[i];
            }
            cout << endl ;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/secoding/p/9532537.html

时间: 2024-10-08 13:46:46

树的层次遍历(Trees on the level,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 =

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

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

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

树——通用树的层次遍历

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

LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)

103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). LeetCode103. Binary Tree Zigzag Level Order Traversal中等 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回锯齿形层次遍历如下: [

uva-122 树的层次遍历

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