用了2个queue,一个用来依次保存左右节点,一个用来判断是否应该level+1。
cpp:
/**
* 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) {
if(root->val%2!=1){
return false;
}
queue<TreeNode> aqueueall;
queue<TreeNode> row; // 一行的节点
aqueueall.push(*root);
row.push(*root);
int level = 0;
while(aqueueall.empty()==false){ // 不空
vector<int> listval; // 保存数值
cout<<"row.size = "<<row.size()<<endl;
while(row.empty()==false){
TreeNode node = row.front();
row.pop();
aqueueall.pop();
listval.push_back(node.val); // push_back值
if (node.left!=nullptr){
cout<<"left val = "<<node.left->val<<endl;
aqueueall.push(*node.left);
}
if (node.right!=nullptr){
cout<<"right val = "<<node.right->val<<endl;
aqueueall.push(*node.right);
}
}
cout<<"aqueueall.size() = "<<aqueueall.size()<<endl;
cout<<"listval.size = "<<listval.size()<<endl;
// 查看listval是否符合要求
if (level%2==0){
if (isortedPos(listval)==false){
return false;
}
else{
cout<<"level = "<<level<<",true"<<endl;
}
}
else if (level%2==1){
if (issortedNeg(listval)==false){
return false;
}
else{
cout<<"level = "<<level<<",true"<<endl;
}
}
// 复制1份aqueueall到row
int size = aqueueall.size();
for (int i=0; i<size; i++){
TreeNode node = aqueueall.front();
row.push(node);
aqueueall.pop();
aqueueall.push(node); // 重新入队
}
level +=1;
}
return true;
}
bool isortedPos(vector<int>& avec){ // 是否从小到大有序
cout<<"avec.size(pos) = "<<avec.size()<<endl;
for (int i=0; i<avec.size()-1; i++){
if (avec[i]>=avec[i+1]){
return false;
}
if (avec[i]%2==0 || avec[i+1]%2==0){
return false;
}
}
if (avec[0]%2==0) return false; // 如果只有1个元素
return true;
}
bool issortedNeg(vector<int>& avec){
cout<<"avec.size(neg) = "<<avec.size()<<endl;
for (int i=0; i<avec.size()-1; i++){
if (avec[i]<=avec[i+1]){
return false;
}
if (avec[i]%2==1 || avec[i+1]%2==1){
return false;
}
}
if (avec[0]%2==1) return false; // 如果只有1个元素
return true;
}
};
稍微优化一下
/**
* 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) {
if(root->val%2!=1){
return false;
}
queue<TreeNode> aqueueall;
queue<TreeNode> row; // 一行的节点
aqueueall.push(*root);
row.push(*root);
int level = 0;
vector<int> listval;
while(aqueueall.empty()==false){ // 不空
listval.clear();
// vector<int> listval; // 保存数值
// cout<<"row.size = "<<row.size()<<endl;
while(row.empty()==false){
TreeNode node = row.front();
row.pop();
aqueueall.pop();
listval.push_back(node.val); // push_back值
if (node.left!=nullptr){
// cout<<"left val = "<<node.left->val<<endl;
aqueueall.push(*node.left);
}
if (node.right!=nullptr){
// cout<<"right val = "<<node.right->val<<endl;
aqueueall.push(*node.right);
}
}
// cout<<"aqueueall.size() = "<<aqueueall.size()<<endl;
// cout<<"listval.size = "<<listval.size()<<endl;
// 查看listval是否符合要求
if (level%2==0){
if (isortedPos(listval)==false){
return false;
}
// else{
// cout<<"level = "<<level<<",true"<<endl;
// }
}
else if (level%2==1){
if (issortedNeg(listval)==false){
return false;
}
// else{
// cout<<"level = "<<level<<",true"<<endl;
// }
}
// 复制1份aqueueall到row
int size = aqueueall.size();
for (int i=0; i<size; i++){
TreeNode node = aqueueall.front();
row.push(node);
aqueueall.pop();
aqueueall.push(node); // 重新入队
}
level +=1;
}
return true;
}
bool isortedPos(vector<int>& avec){ // 是否从小到大有序
// cout<<"avec.size(pos) = "<<avec.size()<<endl;
for (int i=0; i<avec.size()-1; i++){
if (avec[i]>=avec[i+1]){
return false;
}
if (avec[i]%2==0 || avec[i+1]%2==0){
return false;
}
}
if (avec[0]%2==0) return false;
return true;
}
bool issortedNeg(vector<int>& avec){
// cout<<"avec.size(neg) = "<<avec.size()<<endl;
for (int i=0; i<avec.size()-1; i++){
if (avec[i]<=avec[i+1]){
return false;
}
if (avec[i]%2==1 || avec[i+1]%2==1){
return false;
}
}
if (avec[0]%2==1) return false;
return true;
}
};