这道题我的思路是先通过递归构建树,然后进行遍历将位置和保存在map映射中,最后按顺序输出map集合中的值。

至于如何遍历,我是依次尝试了宽度优先遍历和深度优先遍历,当然这都是可以的。不过期间写错了很多次。在此总结以下在这道题目中犯得错误(逻辑错误):

  1. 同一树,根节点地址不变,却多次使用
  2. 同一映射,不经清空却多次添加
  3. 遍历时在队列和栈中添加进的节点不是当前节点(即写错节点名称)
  4. 栈溢出导致结果出错
  5. 对一个节点分配内存只能在同一函数中进行 //否则需要添加指针引用(*指针也需要引用)

。。。。

以下附上我的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的更多相关文章

  1. UVa699 The Falling Leaves

      // UVa699 The Falling Leaves // 题意:给一棵二叉树,每个节点都有一个水平位置:左儿子在它左边1个单位,右儿子在右边1个单位.从左向右输出每个水平位置的所有结点的权值 ...

  2. 【数据结构】The Falling Leaves(6-10)

    [UVA699]The Falling Leaves 算法入门经典第6章例题6-10(P159) 题目大意:有一颗二叉树,求水平位置的和. 试题分析:乱搞就可以过,将树根节点的pos记为0,向左-1, ...

  3. UVA 699 The Falling Leaves (二叉树水题)

    本文纯属原创.转载请注明出处,谢谢. http://blog.csdn.net/zip_fan. Description Each year, fall in the North Central re ...

  4. H - The Falling Leaves

    Description Each year, fall in the North Central region is accompanied by the brilliant colors of th ...

  5. UVA - 699The Falling Leaves(递归先序二叉树)

    The Falling Leaves Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Sub ...

  6. POJ 1577 Falling Leaves 二叉搜索树

    HDU 3791 Falling Leaves 二叉搜索树  Figure 1Figure 1 shows a graphical representation of a binary tree of ...

  7. UVA.699 The Falling Leaves (二叉树 思维题)

    UVA.699 The Falling Leaves (二叉树 思维题) 题意分析 理解题意花了好半天,其实就是求建完树后再一条竖线上的所有节点的权值之和,如果按照普通的建树然后在计算的方法,是不方便 ...

  8. The Falling Leaves(建树方法)

    uva 699 紫书P159 Each year, fall in the North Central region is accompanied by the brilliant colors of ...

  9. UVa 699 The Falling Leaves(递归建树)

    UVa 699 The Falling Leaves(递归建树) 假设一棵二叉树也会落叶  而且叶子只会垂直下落   每个节点保存的值为那个节点上的叶子数   求所有叶子全部下落后   地面从左到右每 ...

  10. UVa 699 The Falling Leaves (树水题)

    Each year, fall in the North Central region is accompanied by the brilliant colors of the leaves on ...

随机推荐

  1. linux内核设计与实现--从内核出发

    linux内核有两种版本:稳定的和处于开发中的. linux通过一种简单的命名机制来区分稳定的和处于开发中的内核,使用3个或者4个“.”分割的数字来代表不同内核版本. 如:2.6.26.1:第一个数字 ...

  2. 基于nginx和uWSGI在Ubuntu上部署Djan

    http://www.jianshu.com/p/e6ff4a28ab5a 文/Gevin(简书作者)原文链接:http://www.jianshu.com/p/e6ff4a28ab5a著作权归作者所 ...

  3. XEP-0079

    XEP-0045: 多用户聊天 摘要: 本文定义了一个XMPP协议扩展用于多用户文本会议.即多个XMPP可以在一个房间或频道互相交流信息, 类似互联网中继聊天系统(IRC).还有标准聊天室功能如聊天室 ...

  4. 新浪SAE使用Thinkphp框架,禁用memcache节省豆子的方法

    请在入口文件定义常量,SAE_RUNTIME为true请在本地打开命令行, cd 到项目所在文件夹,执行命令: php index.php 此时会在./App/Sae_Runtime目录下批量生成缓存 ...

  5. 常用自动化测试工具介绍(支持B/S、C/S)

    一.功能测试工具1.QTP测试工具 全名HP QuickTest Professional software ,最新的版本为HP QuickTest Professional 11.0 QTP是qui ...

  6. Android--ListView显示列表数据

    简单的显示 import android.os.Bundle; import android.app.ListActivity; import android.view.View; import an ...

  7. SQLSERVER的兼容级别

    今天采用SQL Mannager 2008连接远程的sqlserver数据库,之后弹出一个对话框,修改SQL兼容级别,当时每太注意,一下点击了确定按钮,结果导致两个系统SQL只想全部出错,幸亏发现的早 ...

  8. Arch yaourt 安装

    安装yaourt,最简单安装Yaourt的方式是添加Yaourt源至您的 /etc/pacman.conf:[archlinuxcn]#The Chinese Arch Linux communiti ...

  9. struts2+hibernate+poi导出Excel实例

    本实例通过struts2+hibernate+poi实现导出数据导入到Excel的功能 用到的jar包: poi 下载地址:http://poi.apache.org/ 根据查询条件的选择显示相应数据 ...

  10. Grunt 之通配符

    在描述源码路径的时候,经常有一些特殊的奇怪的要求.Grunt 通过内建的 node-glob 和 minimatch 库提供了文件名的扩展机制. 常见的通配符如下: * 匹配除了 / 之外的任意数量的 ...