/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
#include <climits>
class Solution {
public:
vector<bool> judgeIt(TreeNode* root) {
if(root == nullptr){
return {true, true};
}
vector<bool> ans={true, true};
value( root, ans, INT_MIN, INT_MAX );
ans[1] = wanquan(root);
return ans;
}
bool wanquan(TreeNode* root){
queue<TreeNode*> q;
q.push(root);
while( q.front() ){ //层序遍历,遇到实节点,弹出,放入左右节点
TreeNode* node = q.front();q.pop();
q.push(node->left);
q.push(node->right);
}
while( q.size() && !q.front() ){ //遇到空节点,再循环,不能出现实节点
q.pop();
}
return q.empty(); //若不为空则表示,后续还有实节点,false
}
int value( TreeNode* root, vector<bool>& ans, int up_min, int up_max){
if(root == nullptr){
return -1;
}
int left = value(root->left, ans, up_min, root->val);
int right = value(root->right, ans, root->val, up_max);
if( left != -1 && !(left <= root->val && left >= up_min) ){
ans[0] = false;
}
if( right != -1 && !(right >= root->val && right <= up_max) ){
ans[0] = false;
}
return root->val; //层数+1;
}
};