传送门:牛客
题目描述:
在二进制世界里, 有很多的树, 比如常见的二叉树
而二叉搜索树是比较特殊的一种二叉树, 对于树上的每个节点
它的权值大于等于它的左子树节点, 小于等于它右子树的节点
现在给你若干个二叉树, 请判断它们是否是二叉搜索树
输入:
3
3 1
4 2 3
3 0 0
5 0 0
3 1
4 0 2
5 0 3
5 0 0
4 4
4 2 3
3 0 0
5 0 0
4 1 0
输出:
yes
yes
no
一道较为简单的dfs序的题目
我们把玩一下题意会发现只要我们按照左子树->根节点->右节点这样的顺序进行 d f s dfs dfs的话,形成的 d f s dfs dfs序必须是一个递增序列才能满足要求
所以我们可以进行一遍遍历求出 d f s dfs dfs序,然后再判断一下这个 d f s dfs dfs序是不是满足递增序列即可
下面是具体的代码部分:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
ll x=0,w=1;char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
#define maxn 1000000
const double eps=1e-8;
#define int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int n,m;
vector<int>edge1;
vector<int>edge2;
struct Tree{
int l,r,w;
}tree[maxn];
void dfs(int u) {
if(tree[u].l) dfs(tree[u].l);
edge1.push_back(tree[u].w);
edge2.push_back(tree[u].w);
if(tree[u].r) dfs(tree[u].r);
}
int main() {
int T=read();
while(T--) {
edge1.clear();edge2.clear();
memset(tree,0,sizeof(tree));
n=read();int RT=read();
for(int i=1;i<=n;i++){
tree[i].w=read();tree[i].l=read(),tree[i].r=read();
}
dfs(RT);
sort(edge2.begin(),edge2.end());
int flag=0;
for(int i=0;i<edge1.size();i++) {
if(edge1[i]!=edge2[i]) {
flag=1;
break;
}
}
if(flag==1) {
cout<<"no"<<endl;
}
else {
cout<<"yes"<<endl;
}
}
return 0;
}