作者 usx程序设计类课程组
单位 绍兴文理学院
根据带虚结点的先序序列建立二叉树,然后判断其是否为二叉排序树。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个数字字符串(不含0
且长度不超过20),表示二叉树的先序遍历序列,其中字符*
表示虚结点(对应的子树为空)。
输出格式:
对于每组测试,输出是否二叉排序树的判定结果,是输出YES
,否则输出NO
。
输入样例:
56**87***
54**87***
输出样例:
NO
YES
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
#include <string>
#include <queue>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};
//构建二叉树
TreeNode* buildTree(queue<string>& a){
if(a.empty())return nullptr;
string x = a.front();
a.pop();
if(x=="*")return nullptr;
TreeNode* root = new TreeNode(stoi(x));
root->left = buildTree(a);
root->right = buildTree(a);
return root;
}
//判断
bool isBST(TreeNode* root,int min,int max){
if(root == nullptr)return true;
if(root->val<=min||root->val>=max)return false;
return isBST(root->left,min,root->val)&&isBST(root->right,root->val,max);//左右子树要同时满足
}
int main(){
string s;
int max = 100010;
int min = -100010;
while(cin>>s){
queue<string> a;
for(char c : s){
a.push(string(1, c));
}
TreeNode* root = buildTree(a);
if(isBST(root, min, max)){
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}
}
}