`
king_tt
  • 浏览: 2260171 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

UVa 699 - The Falling Leaves 二叉树的落叶

 
阅读更多

题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=640


题目类型: 数据结构, 二叉树



题目大意:



每年的秋天, 北方的树叶伴随着灿烂无比的颜色, 叶子随风飘落到树下, 地上很快就积累一大堆。

如果同样的事情发生在二叉树, 树上的结点都慢慢落下来, 那该是什么样的景象?

二叉树也是树。


对于一颗二叉树,把每个结点看成一个树枝,结点上的值为那个树枝上的叶子数量。对于每个结点, 它与左儿子和右儿子的距离都是一个单位。

如上图,根结点5与6是在同一垂直线上的, 7和5相距一个单位。


然后, 秋天来了,二叉树的叶子落下了, 而且天气很好,没有风, 所以二叉树的叶子是垂直落下来的。 最后, 同一垂直线的结点的叶子都落在同一堆

上。 让我们求出每一堆上的叶子数量。



解题思路:

题目给出一串数字, 是按照前序遍历给出的, -1表示那个结点为空。

首先可以递归构造出这棵二叉树, 然后再深搜计算出没一堆的数量。

计算时, 我用的技巧是开一个1000大小的数组result, 500坐标位置存根结点, 然后递归时,往左儿子走,坐标-1, 往右儿子走,坐标+1.


这题也可以不用建树, 可以在建树的递归上 直接计算结果。 下面是两个版本的代码。


样例输入:

5 7 -1 6 -1 -1 3 -1 -1
8 2 9 -1 -1 6 5 -1 -1 12 -1
-1 3 7 -1 -1 -1
-1


样例输出:

Case 1:
7 11 3

Case 2:
9 7 21 15

版本一: 建树版

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int END = -2147483645;
int arr[1000], aSize, result[1000];

class Node{
public:
    int data;
    Node *father;
    Node *left;
    Node *right;
};
Node node[1000];
int indexNode, pos;

inline Node* BuildRoot(int n){
    indexNode = 1;
    node[0].data = n;
    node[0].father = NULL;
    node[0].left = node[0].right = NULL;
    return &node[0];
}

inline Node* NewNode(){
    node[indexNode].left = NULL;
    node[indexNode].right = NULL;
    return &node[indexNode++];
}

Node* build(Node *root){
    if(pos>=aSize) return NULL;
    if(arr[pos]==-1) {
        return NULL;
    } 
    root = NewNode();
    root->data = arr[pos];
    ++pos;
    root->left = build(root->left);
    ++pos;   
    root->right = build(root->right);
    return root;
}

void preOrder(Node *root){
    if(root){
        printf("%d ", root->data);
        preOrder(root->left);
        preOrder(root->right);
    }
}

void dfs(Node *root, int index){
    if(root){
        result[index] += root->data;
    //    printf("%d: %d, ",root->data, index);
        dfs(root->left, index-1);
        dfs(root->right, index+1);
    }
}

void Solve(){
    Node *root=NULL;
    pos=0;
    indexNode = 0;
    root = build(root);
    memset(result, 0, sizeof(result));
    dfs(root, 500);
    int i=0;
    while(result[i]==0) ++i;
    printf("%d", result[i++]);
    for( ; result[i]!=0; ++i)
        printf(" %d", result[i]); 
    printf("\n\n");   
}

int main(){
    freopen("input.txt","r",stdin);
    int cas=1;
    while(~scanf("%d", &arr[0]) && arr[0]!=-1){
        aSize = 1;
        int cnt1=1, cnt2=0;
        while(getchar()){
            scanf("%d", &arr[aSize++]);
            if(arr[aSize-1]==-1)
                ++cnt2;
            else
                ++cnt1;
            if(cnt1+1==cnt2)
                break;
        }   
        printf("Case %d:\n", cas++);
        Solve();
    }
    return 0;
}


版本二: 不建树版

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int arr[1000], aSize, result[1000];

int indexNode, pos;

void build(int index){
    if(pos>=aSize) return ;
    if(arr[pos]==-1) {
        return ;
    } 
    result[index] += arr[pos];
    ++pos;
    build(index-1);
    ++pos;   
    build(index+1);
}

void Solve(){
    pos=0;
    indexNode = 0;
    memset(result, 0, sizeof(result));
    build(500);
    int i=0;
    while(result[i]==0) ++i;
    printf("%d", result[i++]);
    for( ; result[i]!=0; ++i)
        printf(" %d", result[i]); 
    printf("\n\n");   
}

int main(){
 // freopen("input.txt","r",stdin);
    int cas=1;
    while(~scanf("%d", &arr[0]) && arr[0]!=-1){
        aSize = 1;
        int cnt1=1, cnt2=0;
        while(getchar()){
            scanf("%d", &arr[aSize++]);
            if(arr[aSize-1]==-1)
                ++cnt2;
            else
                ++cnt1;
            if(cnt1+1==cnt2)
                break;
        }   
        printf("Case %d:\n", cas++);
        Solve();
    }
    return 0;
}



—— 生命的意义,在于赋予它意义。

原创http://blog.csdn.net/shuangde800By D_Double






分享到:
评论

相关推荐

    falling-leaves:创建落叶的 SVG 动画

    在这个“falling-leaves”项目中,SVG 用于绘制单个落叶的形状,并通过 Python 脚本生成多个落叶,形成动画效果。 Python 在这个项目中的作用是生成 SVG 代码并控制动画的逻辑。我们可以使用 Python 的库,如 `xml....

    6DOF-case-of-sphere-falling.rar_fluent falling_fluent小球入水_入水模拟 F

    标题中的“6DOF-case-of-sphere-falling”指的是六自由度(6DOF)的球体下落情况,这是在模拟物理系统时常用的概念。六自由度包括三个线性自由度(沿X、Y、Z轴的平移)和三个旋转自由度(绕X、Y、Z轴的旋转)。在本...

    html5-canvas-fire-falling.zip

    "html5-canvas-fire-falling.zip"这个压缩包很可能包含了一个使用HTML5 Canvas技术实现的火焰下落动画示例。在这个场景中,我们将探讨HTML5 Canvas的基础知识、Canvas API以及如何用它来创建类似火焰下落的效果。 ...

    FLUENT-MDM-tut-01_2d-falling-box

    ### FLUENT-MDM-tut-01_2d-falling-box 教程解析:解决二维下落箱体问题 #### 引言 本教程旨在为设置和解决一个结合了移动变形网格(MDM)技术、六自由度(6DOF)求解器以及体积流体(VOF)多相模型的案例提供指导...

    21005 - Falling Water.mpd

    21005 - Falling Water

    Human-Falling-Detect-Tracks:AlphaPose + ST-GCN + SORT

    人体跌倒检测与追踪使用Tiny-YOLO oneclass检测帧中的每个人,并使用获取骨骼姿势,然后使用模型从每个人跟踪的每30帧中预测动作。 现在支持7种动作:站立,行走,坐着,躺下,站起来,坐下,跌倒。...

    catch-a-falling-star:游戏

    在这个“catch-a-falling-star”游戏中,JavaScript代码创建了星星对象,定义它们的行为(如下落速度、随机生成位置),并监听用户的鼠标或触摸事件,判断用户是否成功捕获星星。此外,JavaScript还用于更新游戏状态...

    Tical - another falling-blocks game-开源

    Tical是又一款落地障碍游戏,具有可自由调节的场地大小和“环绕模式”,其中场地的左右边界是虚拟连接的。

    js13k-2013-world-is-falling:jsk13 compo 的多人游戏入口

    《js13k-2013-world-is-falling: JavaScript竞技场的多人游戏探索》 在编程领域,JavaScript作为一种广泛使用的脚本语言,不仅在前端开发中占据主导地位,而且在游戏开发方面也展现出强大的潜力。这个项目"js13k-...

    canvas-falling-squares:有时,你只是想要下落的方块

    script src =" canvas-falling-squares.js " &gt; &lt;/ script &gt; 在 AMD 加载器中: require ( [ 'canvas-falling-squares' ] , function ( FallingSquares ) { /*…*/ } ) ; 或者使用 Bower: bower install ...

    Falling Snow-crx插件

    【Falling Snow-crx插件】是一款专为增强网络浏览体验而设计的浏览器扩展程序,主要功能是在用户浏览网页时模拟下雪效果,为用户提供一个充满冬季氛围的视觉体验。这款插件支持英文(美国)语言,使得全球范围内喜爱...

    Falling-nes:Falling-NES游戏

    "Falling-nes"是一款基于任天堂NES(Nintendo Entertainment System)平台的自制游戏,它展示了家庭brew(homebrew)开发的魅力。在本文中,我们将深入探讨与这个项目相关的多个IT知识点,包括NES游戏开发、6502汇编...

    fall-detect-track:行人跌倒检测

    《行人跌倒检测:深入解析fall-detect-track项目》 行人跌倒检测是计算机视觉领域中的一个重要课题,尤其是在智能安全监控、健康护理和公共安全等领域具有广泛应用。fall-detect-track项目正是专注于这一领域的研究...

    falling_bird.zip

    自己使用jq html 编写的《falling_bird 坠落的小鸟》 ,自己原创估计有,逻辑上的bug,给大家一个举一反三的示例,谢谢大家,我的邮箱 lizhilimaster@163.com #### 使用方法:按压空格即可(也可以重新开始) github...

    calc-physics-of-falling-objects::droplet:用来计算掉落物体参数的工具

    计算掉落物体参数的工具 该工具考虑了物体的空气阻力。 如果不是因为空气阻力,则对象将具有线性加速度,事实并非如此。 输入物体的高度,质量和形状,此工具将提供 物体将掉落多长时间 物体的最大速度是多少 ...

    Human-detection-and-Tracking-master源码

    《Android人体检测与追踪源码解析》 在移动设备领域,Android系统因其开源特性而备受开发者喜爱。在这款名为"Human-detection-and-Tracking-master"的项目中,开发者提供了一个人体检测与追踪的源码实现,这对于...

    css3落叶场景动画

    1. **选择器**: 使用更精确的选择器(如类选择器 `.falling-leaf` 或 ID 选择器 `#leaf1`)来指定动画应用的对象。 2. **关键帧动画 (@keyframes)**: 定义动画的起始和结束状态,以及中间的任意状态。例如: ```...

    外研版一起小学英语六下《Module 4Unit 2 The apples are falling down the stair

    这篇文档是关于外研版小学英语六年级下册Module 4 Unit 2 "The apples are falling down the stairs" 的教学教案。本单元的教学内容聚焦在英语对话和句型的学习上,旨在帮助学生复习和掌握新的句子结构,并提升他们...

    esri-fonts-pbf-arial-unicode-ms-regular

    在IT行业中,Esri是一个知名的地理信息系统(GIS)软件提供商,其产品广泛应用于地图制作、地理数据分析等领域。ArcGIS API for JavaScript是Esri提供的一种Web开发工具,它允许开发者使用JavaScript构建交互式的...

Global site tag (gtag.js) - Google Analytics