首页 > 其他 > 详细

Uva 839天平(二叉树dfs, 递归建树)

时间:2017-07-19 13:18:54      阅读:134      评论:0      收藏:0      [点我收藏+]

题意:

给定一个天平长度 输入格式为

wl dl wr dr 

分别代表天平左边长度,左边重量, 右边长度, 右边重量。

如果重量为0, 说明下面还有一个天平, 递归给出。

样例输入:
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2

技术分享

如果天平是左右重量相等的 输出YES 否则输出NO。

分析:

既然以递归的定义输入, 那么我们程序最好写成递归建树,如果有重量是0, 那么就递归建左子树或者右子树 , 如果是叶子节点的父节点(这个天平下面没天平), 那么就判断左右是否相等返回即可(也可建一个全局变量, 一个不满足就可以输出NO了)。 我的程序是把树建造出来再判断, 有点冗余。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6;
struct Node{
  int wl,dl,wr,dr;
  int left, right;
  Node():wl(0),dl(0),wr(0),dr(0){}
};
Node tree[maxn];
const int root = 1;
int cnt = 0, ok;
int build(int u){
    int wl,dl,dr,wr;
    scanf("%d %d %d %d",&wl,&dl,&wr,&dr);
    tree[u].wl = wl;
    tree[u].dl = dl;
    tree[u].wr = wr;
    tree[u].dr = dr;
    if(!wl) {
            tree[u].left = ++cnt;
            build(cnt);
    }
    if(!wr) {
            tree[u].right = ++cnt;
            build(cnt);
    }
}
int post(int u){
    if(!tree[u].wl) {
        tree[u].wl = post(tree[u].left);
    }
    if(!tree[u].wr) {
        tree[u].wr = post(tree[u].right);
    }
    if(tree[u].wl * tree[u].dl != tree[u].wr * tree[u].dr)
         ok = 0;
    return tree[u].wl + tree[u].wr;
}
int main(){

    int T;
    scanf("%d", &T);
    int flag = 0;
    while(T--){
        if(!flag){
            flag = 1;
        }
        else printf("\n");
        cnt = root;
        build(root);
        ok = 1;
        post(root);
        printf("%s\n",ok ? "YES":"NO");
    }
    return 0;
}

 

Uva 839天平(二叉树dfs, 递归建树)

原文:http://www.cnblogs.com/Jadon97/p/7205082.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!