例题6-10 The Falling Leaves,UVA699
这道题我的思路是先通过递归构建树,然后进行遍历将位置和保存在map映射中,最后按顺序输出map集合中的值。
至于如何遍历,我是依次尝试了宽度优先遍历和深度优先遍历,当然这都是可以的。不过期间写错了很多次。在此总结以下在这道题目中犯得错误(逻辑错误):
- 同一树,根节点地址不变,却多次使用
- 同一映射,不经清空却多次添加
- 遍历时在队列和栈中添加进的节点不是当前节点(即写错节点名称)
- 栈溢出导致结果出错
- 对一个节点分配内存只能在同一函数中进行 //否则需要添加指针引用(*指针也需要引用)
。。。。
以下附上我的AC代码:
#include <cstdio>
#include <queue>
#include <iostream>
#include <vector>
#include <map>
#include <stack>
using namespace std;
struct Node{
Node *left;
Node *right;
int v;
int k;
Node():left(NULL),right(NULL){}
};
map<int,int> m;
void remove_tree(Node* u){
if(u==NULL)return ;
remove_tree(u->left);
remove_tree(u->right);
delete u;
}
int solve(Node *& u){//特别注意这一段
int v;
scanf("%d", &v);
if(v == -){ u->v=;return ;}
else {
u->left = new Node();
u->right = new Node();
u->v = v;
solve(u->left);//左子树
solve(u->right);//右子树
}
return ;
}
queue<Node*> q;
//宽度优先遍历
void bfs(Node * u){
u->k=;
q.push(u);
while(!q.empty()){
Node * node =q.front();
q.pop();
if(node->v)m[node->k] = m[node->k]+(node->v);
if(node->left!=NULL&&node->left->v){node->left->k = (node->k)-;; q.push(node->left);}
if(node->right!=NULL&&node->right->v){node->right->k = (node->k )+ ; q.push(node->right);}
} }
stack<Node*> s;
//深度优先遍历:stl栈板
void dfs1(Node* u,int k){ u->k=k;
s.push(u);
while(!s.empty()){
Node *node=s.top();
s.pop();
if(node->left!=NULL&&node->left->v){node->left->k=(node->k)-;s.push(node->left);}
if(node->v)m[node->k] = m[node->k]+(node->v); if(node->right!=NULL&&node->right->v){node->right->k=(node->k)+;s.push(node->right);} }
}
//深度优先遍历:递归版
void dfs(Node* u,int k){
// printf("%d ,%d\n",u->v,k);
if(u->v)m[k] = m[k]+(u->v);
if(u->left!=NULL&&u->left->v)dfs(u->left,k-);
if(u->right!=NULL&&u->right->v)dfs(u->right,k+);
}
int main(){
#ifdef DEBUG
freopen("6.10.in","r",stdin);
freopen("6.10.out","w",stdout);
#endif
int n = ,r;
Node *root=new Node() ;
while((r=solve(root))){
printf("Case %d:\n",++n);
bfs(root); //*****************注意在一个树使用完毕之后一定要删除它
remove_tree(root);
root=new Node();//注意要重新建一个根节点 int first=;
for(map<int,int>::iterator it = m.begin(); it!= m.end(); ++it){
if(!first)cout<<" ";else first=;
cout <<it->second;
}
m.clear();//使用完之后要清空 printf("\n");
if(r)printf("\n");
else break;
}
return ;
}
例题6-10 The Falling Leaves,UVA699的更多相关文章
- UVa699 The Falling Leaves
// UVa699 The Falling Leaves // 题意:给一棵二叉树,每个节点都有一个水平位置:左儿子在它左边1个单位,右儿子在右边1个单位.从左向右输出每个水平位置的所有结点的权值 ...
- 【数据结构】The Falling Leaves(6-10)
[UVA699]The Falling Leaves 算法入门经典第6章例题6-10(P159) 题目大意:有一颗二叉树,求水平位置的和. 试题分析:乱搞就可以过,将树根节点的pos记为0,向左-1, ...
- UVA 699 The Falling Leaves (二叉树水题)
本文纯属原创.转载请注明出处,谢谢. http://blog.csdn.net/zip_fan. Description Each year, fall in the North Central re ...
- H - The Falling Leaves
Description Each year, fall in the North Central region is accompanied by the brilliant colors of th ...
- UVA - 699The Falling Leaves(递归先序二叉树)
The Falling Leaves Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Sub ...
- POJ 1577 Falling Leaves 二叉搜索树
HDU 3791 Falling Leaves 二叉搜索树 Figure 1Figure 1 shows a graphical representation of a binary tree of ...
- UVA.699 The Falling Leaves (二叉树 思维题)
UVA.699 The Falling Leaves (二叉树 思维题) 题意分析 理解题意花了好半天,其实就是求建完树后再一条竖线上的所有节点的权值之和,如果按照普通的建树然后在计算的方法,是不方便 ...
- The Falling Leaves(建树方法)
uva 699 紫书P159 Each year, fall in the North Central region is accompanied by the brilliant colors of ...
- UVa 699 The Falling Leaves(递归建树)
UVa 699 The Falling Leaves(递归建树) 假设一棵二叉树也会落叶 而且叶子只会垂直下落 每个节点保存的值为那个节点上的叶子数 求所有叶子全部下落后 地面从左到右每 ...
- UVa 699 The Falling Leaves (树水题)
Each year, fall in the North Central region is accompanied by the brilliant colors of the leaves on ...
随机推荐
- NAND FLASH均衡算法笔记(转)
转来一篇关于NAND FLASH均衡算法的文章,加上一点思考和笔记,认为这种思考有助于更深刻的理解,更好的记忆,所以也算半原创了吧,最起码笔记是原创的.有意思的是,帖子提起这个算法并不是因为嵌入式开发 ...
- position中多次用到了relative和absolute,能不能具体介绍一下这两者的区别?
position中多次用到了relative和absolute,能不能具体介绍一下这两者的区别? 一个是相对定位,一个是绝对定位. absolute生成绝对定位的元素,相对于 static 定位以外的 ...
- textarea文本换行和页面显示换行符
在textarea里写的文本有换行,但是显示到页面后就不会自动换行,通过对数据分析发现textarea里的换行符是\n\r,然而HTML中的换行为<\br>解决办法有两种: 第一种:把文本 ...
- windows 下使用 zip安装包安装MySQL 5.7
以下内容参考官方文档:http://dev.mysql.com/doc/refman/5.7/en/windows-start-command-line.html 解压缩zip到D:\mysql-5. ...
- 使用mustache.js 模板引擎输出html
看了https://mustache.github.io/你就知道mustache是非常强大的模板引擎,支持多种语言,下面是个简单入门例子: MVC Model public class Studen ...
- 你可能不知道的 30 个 Python 语言的特点技巧
列表按难度排序,常用的语言特征和技巧放在前面. 1.1 分拆 >>> a, b, c = 1, 2, 3>>> a, b, c(1, 2, 3)> ...
- windows查看端口占用
查看占用端口的进程ID netstat -aon | findstr "9000" 再用进程ID查看进程 tasklist | findstr "6048"
- Asp.net把UTF-8编码转换为GB2312编码
系统采用的UTF-8编码,而一些支持系统使用的是GB2312编码. 不同编码的页面.脚本之间互相引用,就会产生乱码的问题,解决方法就是统一成一种编码.asp.net 中,如果要修改输出页面的编码,可以 ...
- 2015 Multi-University Training Contest 6 Cake
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m soda and today i ...
- Android数据的四种存储方式
作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...