PTA 7-31 笛卡尔树 (25 point(s))

 

#include <bits/stdc++.h>
using namespace std;

struct Tree{
    int k1, k2, l, r;
};

int n, k1, k2, l, r, root = -1;
bool father[1000]{false};
vector<int> v1, v2;
vector<Tree> tree;

void dfs(int u){
    // 递归边界 结点不存在则退出
    if(u == -1)
        return;
    dfs(tree[u].l);
    // 储存中序输出(左 < 根 < 右)
    v1.push_back(tree[u].k1), v2.push_back(tree[u].k1);
    dfs(tree[u].r);
}

bool judgek1(){
    dfs(root);
    sort(begin(v1), end(v1));
    // 排序后输出与原输出相同 符合二叉树性质
    for(int i = 0; i < v1.size(); i++)
        if(v1[i] != v2[i])
            return false;
    return true;
}

bool judgek2(){
    // 最小堆 每个结点性质 左右孩子k2比父节点大
    for(auto t : tree){
        // 孩子不存在不需要访问 否则进入下一个判断可能会出错
        if(t.l != -1)
            if(tree[t.l].k2 <= t.k2)
                return false;
        if(t.r != -1)
            if(tree[t.r].k2 <= t.k2)
                return false;
    }
    return true;
}

int main() {
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> k1 >> k2 >> l >> r;
        tree.push_back({k1, k2, l, r});
        // 标记编号结点是否有父节点
        father[l] = (l == -1 ? false : true);
        father[r] = (r == -1 ? false : true);
    }
    // 找到根节点所在编号(根节点没有父节点)
    while(father[++root] == true);
    if(judgek1() == true && judgek2() == true && tree.size() == n){
        cout << "YES";
        exit(0);
    }
    cout << "NO";
}

vis[l] = (l == -1 ? 0 : 1);

参考代码这部分,由于输入编号会有-1存在所以会出现数组[-1]越界的情况。但这里-1指的是vis数组之前的一位地址,前面存在其他数据所以没出现指出程序以外数据,导致报错。

但这里不知道-1具体指向了什么数据,虽然从结果上看并没有问题。

参考代码        参考理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值