#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具体指向了什么数据,虽然从结果上看并没有问题。