如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
- 二叉树根节点所在层下标为
0
,根的子节点所在层下标为1
,根的孙节点所在层下标为2
,依此类推。 - 偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增
- 奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减
给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true
,否则返回 false
。
示例 1:
输入: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 层上的节点值都是偶数且严格递减,因此这是一棵奇偶树。
示例 2:
输入:root = [5,4,2,3,3,7]
输出:false
解释:每一层的节点值分别是:
0 层:[5]
1 层:[4,2]
2 层:[3,3,7]
2 层上的节点值不满足严格递增的条件,所以这不是一棵奇偶树。
示例 3:
输入:root = [5,9,1,3,5,7]
输出:false
解释:1 层上的节点值应为偶数。
示例 4:
输入:root = [1]
输出:true
示例 5:
输入:root = [11,8,6,1,3,9,11,30,20,18,16,12,10,4,2,17]
输出:true
提示:
- 树中节点数在范围
[1, 10]
内 1 <= Node.val <= 10
分析:将二叉树按照层序遍历,并且在遍历的每一层从左到右判断结点值的奇偶性和严格递增递减性。
方法1:获取二叉树的层序遍历结果,然后判断每一层的奇偶性和严格递增递减性。
/**
* 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:
// 二叉树层序遍历(递归方式)
void levelOrder(TreeNode *node, int depth, vector<vector<int>> &level_order)
{
if (!node)
return;
// 如果depth>=level_order.size()表明需要扩容
if (depth >= level_order.size())
level_order.push_back(vector<int> {});
level_order[depth].push_back(node->val);
levelOrder(node->left, depth+1, level_order);
levelOrder(node->right, depth+1, level_order);
}
// 数组为奇数递增
bool isOddAscendingOrder(vector<int> & nums)
{
int len = nums.size();
if (len > 1)
{
for(int i = 1; i < len; ++i)
if (nums[i-1] >= nums[i])
return false;
for(int i=0; i<len; ++i)
if (nums[i] % 2 == 0)
return false;
}
else if (len == 1)
if (nums[0] % 2 == 0)
return false;
return true;
}
// 数组为偶数递减数组
bool isEvenDescendingOrder(vector<int> & nums)
{
int len = nums.size();
if (len > 1)
{
for(int i = 1; i < len; ++i)
if (nums[i-1] <= nums[i])
return false;
for(int i=0; i<len; ++i)
if (nums[i] % 2 != 0)
return false;
}
else if (len == 1)
if (nums[0] % 2 != 0)
return false;
return true;
}
bool isEvenOddTree(TreeNode* root)
{
vector<vector<int>> level_order;
levelOrder(root, 0, level_order);
int n = level_order.size();
bool ans = true;
for(int i=0; i<n; ++i)
{
if (i % 2 == 0)
ans = ans && isOddAscendingOrder(level_order[i]);
else
ans = ans && isEvenDescendingOrder(level_order[i]);
}
return ans;
}
};
方法2:采用队列,按照层序遍历二叉树,并在遍历的过程中判断每一层的奇偶性与严格递增(递减)性。
class Solution {
public:
// 数组为奇数递增
bool isOddAscendingOrder(vector<int> & nums)
{
int len = nums.size();
if (len > 1)
{
for(int i = 1; i < len; ++i)
if (nums[i-1] >= nums[i])
return false;
for(int i=0; i<len; ++i)
if (nums[i] % 2 == 0)
return false;
}
else if (len == 1)
if (nums[0] % 2 == 0)
return false;
return true;
}
// 数组为偶数递减数组
bool isEvenDescendingOrder(vector<int> & nums)
{
int len = nums.size();
if (len > 1)
{
for(int i = 1; i < len; ++i)
if (nums[i-1] <= nums[i])
return false;
for(int i=0; i<len; ++i)
if (nums[i] % 2 != 0)
return false;
}
else if (len == 1)
if (nums[0] % 2 != 0)
return false;
return true;
}
bool isEvenOddTree(TreeNode* root)
{
if (!root) return false;
bool ans = true;
queue<TreeNode *> Q;
Q.push(root);
int level = 0;
while(!Q.empty())
{
vector<int> nodes_val;
int len = Q.size();
for(int i=0; i<len; ++i)
{
TreeNode * node = Q.front();
Q.pop();
nodes_val.emplace_back(node->val);
if (node->left) Q.push(node->left);
if (node->right) Q.push(node->right);
}
if (level % 2 == 0)
ans = ans && isOddAscendingOrder(nodes_val);
else
ans = ans && isEvenDescendingOrder(nodes_val);
level++;
}
return ans;
}
};
欢迎交流,批评指正!