题目
如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。
- 偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增
- 奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减
给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true ,否则返回 false 。
输入:root = [1,10,4,3,null,7,9,12,8,6,null,null,2]
输出:true
解释:每一层的节点值分别是:
0 层:[1]
1 层:[10,4]
2 层:[3,7,9]
3 层:[12,8,6,2]
由于 0 层和 2 层上的节点值都是奇数且严格递增,而 1 层和 3 层上的节点值都是偶数且严格递减,因此这是一棵奇偶树。
解题思路
使用队列进行层次遍历。在遍历过程中进行判断,如果不满足奇偶树的条件,返回false。
如果满足,继续进行层序遍历,知道整棵树遍历完成。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
#define N 100002
bool isEvenOddTree(struct TreeNode* root){
// 数组模拟队列
struct TreeNode* queue[N];
int front = 0;
int rear = 0;
int odd = 0; // 1奇数 0偶数层
int pre; // 保存前一个结点的值
queue[rear++] = root;
while(front != rear)
{
// 偶数层
if(odd == 0)
pre = INT_MIN;
// 奇数层
if(odd == 1)
pre = INT_MAX;
int cnt = rear - front;
for(int i = 0; i < cnt; ++i)
{
root = queue[front++];
if((odd == 0) && (root->val % 2 == 0 || root->val <= pre))
return false;
if((odd == 1) && (root->val %2 == 1 || root->val >= pre))
return false;
pre = root->val;
if(root->left)
queue[rear++] = root->left;
if(root->right)
queue[rear++] = root->right;
}
odd = (odd+1) % 2;
}
return true;
}