题目
如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
- 二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。
- 偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增
- 奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减
给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true ,否则返回 false 。
通俗的说,就是一颗二叉树,从0开始作为层数,偶数层节点值从左往右为奇数递增,奇数层节点为从左往右偶数递减。
来源:力扣(LeetCode)
解答
需要一层一层的遍历,自然想到二叉树的层序遍历。
通过队列结构,存储每一行的节点,依次出队进行遍历即可。
class Solution {
public:
bool isEvenOddTree(TreeNode *root) {
queue<TreeNode *> qu;
int floor = 0; // 保存当前层数
// 根节点入队
qu.push(root);
while (!qu.empty()) {
int num = (int) qu.size();
auto first = qu.front();
qu.pop();
if ((floor % 2 == 0 && first->val % 2 == 0) ||
(floor % 2 == 1 && first->val % 2 == 1)) {
return false;
}
if (first->left) {
qu.push(first->left);
}
if (first->right) {
qu.push(first->right);
}
int last = first->val;
for (int i = 1; i < num; ++i) {
auto cur = qu.front();
qu.pop();
if (floor % 2 == 0) {
// 偶数层,应该为递增奇数
if (cur->val <= last || cur->val % 2 == 0) {
return false;
}
} else {
// 奇数层,应该为递减偶数
if (cur->val >= last || cur->val % 2 == 1) {
return false;
}
}
last = cur->val;
if (cur->left) {
qu.push(cur->left);
}
if (cur->right) {
qu.push(cur->right);
}
}
floor++;
}
return true;
}
};