UVa 122 (二叉树的层次遍历) Trees on the level
题意:
输入一颗二叉树,按照(左右左右, 节点的值)的格式。然后从上到下从左到右依次输出各个节点的值,如果一个节点没有赋值或者多次赋值,则输出“not complete”
一、指针方式实现二叉树
首先定义一个结构体,然后定义一个结构体指针root,作为整棵树的根节点。如果需要用到左右节点则申请一个空间,也就是用不到的就不申请,以节省空间。
遍历方式是广度优先遍历(BFS),从根节点依次拓展子节点,如果有子节点就入队,然后根节点出队。继续拓展,直到队列为空,即遍历完整棵树。
因为指针丢失以后会造成内存泄露,所以在每次读取二叉树之前都要释放掉上一棵树申请的内存,二叉树的删除也是递归删除的。
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue> const int maxn = ;
char s[maxn];
bool failed;
std::vector<int> ans; struct Node
{
bool have_value; //是否赋值过
int v;
Node *left, *right;
Node():have_value(false), left(NULL), right(NULL) {} //构造函数
};
Node* root; Node* newnode() { return new Node(); } //调用构造函数 void addnode(int v, char* s)
{
int n = strlen(s);
Node* u = root;
for(int i = ; 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 remove_tree(Node* u)
{
if(u == NULL) return;
remove_tree(u->left);
remove_tree(u->right);
delete u;
} bool read_input(void)
{
failed = false;
remove_tree(root);
root = newnode(); for(;;)
{
if(scanf("%s", s) != ) return false;
if(!strcmp(s, "()")) break;
int v;
sscanf(&s[], "%d", &v);
addnode(v, strchr(s, ',') + );
}
return true;
} bool BFS(std::vector<int>& ans)
{
std::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(void)
{
#ifdef LOCAL
freopen("122in.txt", "r", stdin);
#endif while(read_input())
{
if(failed || !BFS(ans)) printf("not complete\n");
else
{
printf("%d", ans[]);
for(int i = ; i < ans.size(); ++i)
printf(" %d", ans[i]);
puts("");
}
} return ;
}
代码君一
二、数组方式实现
每新建一个节点计数器cnt就自增1,而不是像完全二叉树那样,左右子节点是父节点的二倍和二倍加1.
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector> const int maxn = ;
const int root = ;
char s[maxn];
bool have_value[maxn], failed;
int left[maxn], right[maxn], val[maxn], cnt;
std::vector<int> ans; void newtree(void)
{
left[root] = right[root] = ;
have_value[root] = false;
cnt = root;
} int newnode(void)
{
int u = ++cnt;
left[u] = right[u] = ;
have_value[u] = false;
return u;
} void addnode(int v, char* s)
{
int n = strlen(s);
int u = root;
for(int i = ; i < n; ++i)
{
if(s[i] == 'L')
{
if(left[u] == ) left[u] = newnode();
u = left[u];
}
else if(s[i] == 'R')
{
if(right[u] == ) right[u] = newnode();
u = right[u];
}
}
if(have_value[u]) failed = true; //如果一个节点有多次赋值,做标记
val[u] = v;
have_value[u] = true;
} bool read_input(void)
{
failed = false;
newtree(); for(;;)
{
if(scanf("%s", s) != ) return false;
if(!strcmp(s, "()")) break;
int v;
sscanf(&s[], "%d", &v);
addnode(v, strchr(s, ',') + );
}
return true;
} bool BFS(std::vector<int>& ans)
{
std::queue<int> q;
ans.clear();
q.push(root);
while(!q.empty())
{
int u = q.front();
q.pop();
if(!have_value[u]) return false;
ans.push_back(val[u]);
if(left[u] != ) q.push(left[u]);
if(right[u] != ) q.push(right[u]);
}
return true;
} int main(void)
{
#ifdef LOCAL
freopen("122in.txt", "r", stdin);
#endif while(read_input())
{
if(failed || !BFS(ans)) puts("not complete");
else
{
printf("%d", ans[]);
for(int i = ; i < ans.size(); ++i)
printf(" %d", ans[i]);
puts("");
}
} return ;
}
代码君二
三、内存池的方法
静态申请一个Node数组配合一个空闲列表实现一个简单的内存池。
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue> const int maxn = ;
char s[maxn];
bool failed;
std::vector<int> ans; struct Node
{
bool have_value; //是否赋值过
int v;
Node *left, *right;
Node():have_value(false), left(NULL), right(NULL) {} //构造函数
}node[maxn];
Node* root;
std::queue<Node*> freenodes; void Init()
{
for(int i = ; i < maxn; ++i)
freenodes.push(&node[i]); //初始化内存池
} Node* newnode()
{
Node* u = freenodes.front();
u->left = u->right = NULL;
u->have_value = false;
freenodes.pop();
return u;
} void deletenode(Node* u) { freenodes.push(u); } void addnode(int v, char* s)
{
int n = strlen(s);
Node* u = root;
for(int i = ; 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 remove_tree(Node* u)
{
if(u == NULL) return;
remove_tree(u->left);
remove_tree(u->right);
deletenode(u);
} bool read_input(void)
{
failed = false;
remove_tree(root);
Init();
root = newnode();
for(;;)
{
if(scanf("%s", s) != ) return false;
if(!strcmp(s, "()")) break;
int v;
sscanf(&s[], "%d", &v);
addnode(v, strchr(s, ',') + );
}
return true;
} bool BFS(std::vector<int>& ans)
{
std::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(void)
{
#ifdef LOCAL
freopen("122in.txt", "r", stdin);
#endif while(read_input())
{
if(failed || !BFS(ans)) printf("not complete\n");
else
{
printf("%d", ans[]);
for(int i = ; i < ans.size(); ++i)
printf(" %d", ans[i]);
puts("");
}
} return ;
}
代码君三
UVa 122 (二叉树的层次遍历) Trees on the level的更多相关文章
- Uva 122 树的层次遍历 Trees on the level lrj白书 p149
是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担 ...
- Trees on the level UVA - 122 (二叉树的层次遍历)
题目链接:https://vjudge.net/problem/UVA-122 题目大意:输入一颗二叉树,你的任务是按从上到下,从左到右的顺序输出各个结点的值.每个结点都按照从根节点到它的移动序列给出 ...
- UVa 122 树的层次遍历
题意: 给定一颗树, 按层次遍历输出. 分析: 用数组模拟二叉树, bfs即可实现层次遍历 #include <bits/stdc++.h> using namespace std; st ...
- [Swift]LeetCode107. 二叉树的层次遍历 II | Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- 【遍历二叉树】04二叉树的层次遍历【Binary Tree Level Order Traversal】
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,返回他的层次遍历的 ...
- LeetCode 102. 二叉树的层次遍历(Binary Tree Level Order Traversal) 8
102. 二叉树的层次遍历 102. Binary Tree Level Order Traversal 题目描述 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 每 ...
- lintcode : 二叉树的层次遍历II
题目 二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, ...
- lintcode : 二叉树的层次遍历
题目 二叉树的层次遍历 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \ 9 20 / \ 15 7 返回他的分层遍历 ...
- LintCode 二叉树的层次遍历 II
中等 二叉树的层次遍历 II 查看执行结果 42% 通过 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 您在真实的面试中是否遇到过这个 ...
随机推荐
- Firefly卡牌手游《暗黑世界V1.5》服务器端源码+GM管理后台源码
http://www.9miao.com/content-6-304.html Firefly卡牌手游<暗黑世界V1.5>服务器端源码+GM管理后台源码 关于<暗黑世界V1.5> ...
- BeanUtils No value specified for Date的解决方法
/** * ConversionException: No value specified for Date的解决方法 */ ConvertUtils.register(new DateConvert ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)
思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...
- iOS第三方支付-微信支付
微信支付用到的文件 1.首先支持非arc 2.设置URL types 3.AppDelegate - (BOOL)application:(UIApplication *)application di ...
- java 静态构造函数
在java中貌似是没有静态构造函数的. 不过用下面的方式同样可以实现效果. static { }//end 这是静态代码块
- 轻松大幅度降低 Meteor App 的首屏加载时间
许多研究表明,用户最满意的网页加载时间是在2秒以下.能够忍受的较长等待时间上限大概在6-8秒之间.如果需要等待12秒,99%以上的用户会关闭网页离开. 所以如果要给用户提供愉快的使用体验,尽量做到 2 ...
- C. Tourist's Notes
题目链接 题意:n天内登山,相邻两次登山的高度差的绝对值小于等于1,也就是说每次高度变化只能是:0,1,-1.我们已经知道n天中部分天数人所在的山的高度,求最大的登山高度. 输入: n m n 是天 ...
- web服务器【apache/nginx] 关闭目录的浏览权限
web服务器[apache/nginx] 关闭目录的浏览权限 我的配置(将Options 中的Indexes干掉): <VirtualHost *:80> ServerAdmin webm ...
- The absolute uri: http://struts.apache.org/tags-bean cannot be resolved in either web.xml or the jar files deployed with this application
在一个tomcat中部署了一个struts-1.3.10的web项目,但是没有吧struts-1.3.10的lib中的jar包放进tomcat/lib中,所以导致了这个错误(访问该项目的页面时)