当前位置:编程学习 > C/C++ >>

数据结构 uva-699-The Falling Leaves

题目意思:
 
给一颗二叉树,让你按左到右的顺序,输出同一水平位置的所有节点的值的总和。
 
 
 
解题思路:
 
用递归建树,在建树的过程中就把每一水平位置上的总和求出来。在这里我把树根的位置记为150,然后左孩子的位置
 
就为直系父亲位置减1,右孩子为直系父亲位置加1.
 
 
 
代码:
 
[cpp] 
#include<iostream>  
#include<cmath>  
#include<cstdio>  
#include<cstdlib>  
#include<string>  
#include<cstring>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<stack>  
#include<queue>  
#define eps 1e-6  
#define INF (1<<20)  
#define PI acos(-1.0)  
using namespace std;  
  
int ans[330];  
  
void tree(int cur,int loc)  
{  
    if(cur==-1)  //遇到叶子节点,则返回  
        return ;  
    ans[loc]+=cur; //否则在该位置上加上该值  
  
    int left,right;  
  
    scanf("%d",&left);  
    tree(left,loc-1);  //左孩子,位置为父亲的位置减1  
  
    scanf("%d",&right);  
    tree(right,loc+1);  //右孩子,位置为父亲的位置加1  
  
    return ;  
}  
  
  
int main()  
{  
    int cur,ca=0;  
  
    while(scanf("%d",&cur)&&cur!=-1)  
    {  
  
        memset(ans,0,sizeof(ans));  
        tree(cur,150);  //将150置为初始位置  
  
        int i;  
  
        for(i=1;i<=300;i++)  //去掉前面的0  
            if(ans[i])  
                break;  
        if(i==301)  
            continue;  
        printf("Case %d:\n%d",++ca,ans[i]);  
        for(++i;i<=300;i++)  //输出不为0的和值  
            if(ans[i])  
                printf(" %d",ans[i]);  
        printf("\n\n");  
  
    }  
  
    return 0;  
}  
 
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,