题目
思路一 BFS
利用flag标识是偶数位下标还是奇数位下标,利用变量prev标识前一位数。注意,按位与运算符优先级在等于不等于之后。
代码一
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isEvenOddTree(TreeNode* root) {
bool flag=false;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int n=q.size();
int prev=flag?INT_MAX:0,cur=0;
for(int i=0;i<n;i++){
TreeNode* node=q.front();
q.pop();
if(node){
cur=node->val;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
if(flag&&((cur&1)!=0||prev<=cur))
return false;
else if(!flag&&((cur&1)==0||prev>=cur))
return false;
prev=cur;
}
flag=!flag;
}
return true;
}
};
思路二 DFS
用哈希表记录某层的最新数据,同样用flag标识奇数还是偶数层,用prev标识该层前一个数。
代码二
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
unordered_map<int,int> map;
bool isEvenOddTree(TreeNode* root) {
return dfs(root,0);
}
bool dfs(TreeNode* node,int index){
bool flag=index&1;
int prev,cur=node->val;
if(map.count(index))
prev=map[index];
else
prev=flag?INT_MAX:0;
if(flag&&((cur&1)!=0||prev<=cur)) return false;
if(!flag&&((cur&1)==0||prev>=cur)) return false;
map[index]=cur;
if(node->left && !dfs(node->left,index+1)) return false;
if(node->right && !dfs(node->right,index+1)) return false;
return true;
}
};