关键词:
【层序遍历】 【dfs】 【bfs】
2021.12.25 奇偶树
解题思路分析
- 题干中涉及到树的”层“,因此层序遍历少不了。经典层序遍历就是利用队列的bfs,逐行进队列,再依次推入他们的子节点,先左树后右树,层序遍历次序从左往后保持不变。
- 偶数层对应奇数,所以level%2 == val%2时返回false
- 定义pre,根据具体层数初始化后,每到一个值,与pre相比判断是否满足递增或递减的条件即可
- 最后别忘了更新pre和level就行
BFS层序遍历:(迭代)
- 总体思路:同层从左往后依次判断,并同时将它们的左右子树依次入队
- 坑点:进行每一层的循环时,要提前记录好当前层的节点数,int s = q.size(),不可以将q.size()写入每个节点遍历的for循环里,因为q一直在pop和push,每一个节点的循环中,层节点数q.size()实际上一直在改变,需要提前记录
class Solution {
public:
bool isEvenOddTree(TreeNode* root) {
// 层序遍历
if(root == NULL) return true;
queue<TreeNode*> q;
q.push(root);
int l = 0;
while(q.size()){
int pre;
if(l%2 == 0) pre = INT_MIN;
else pre = INT_MAX;
// 要注意
int s = q.size();
for(int i=0;i<s;i++){
TreeNode* n = q.front();
q.pop();
int v = n->val;
if(l%2 == v%2) return false;
if((l%2==1&&v>=pre)||(l%2==0&&v<=pre)) return false;
pre = v;
if(n->left!=NULL) q.push(n->left);
if(n->right!=NULL) q.push(n->right);
}
l++;
}
return true;
}
};