题目链接:leetcode1315
题目简述:
本题给定一个二叉树,求所有祖父节点为偶数的节点的和(祖父节点就是父节点的父节点)
题目思路:
本题采用递归的方法,设置一个标志位flag来记录父节点和祖父节点是偶数还是奇数。根据flag的值以及当前节点的数值的奇偶决定递归调用时的新flag。flag值: 0-父节点和祖父节点都为奇数;1-只有父节点为偶数;2-只有祖父节点为偶数;3-父节点和祖父节点都为偶数。
代码:
class Solution {
private:
vector<vector<int>> ref = {{1, 3, 1, 3}, {0, 2, 0, 2}};
public:
int sumEvenGrandparent(TreeNode* root) {
int ans = 0;
helpfunc(root, 0, ans);
return ans;
}
/* flag:
0: parent and grandparent are neither even
1: only parent even
2: only grandparent even
3: parent and grandparent are both even
*/
void helpfunc(TreeNode* node, int flag, int& ans){
if(node == NULL) return;
if(flag >= 2) ans += node->val;
helpfunc(node->left, ref[node->val%2][flag], ans);
helpfunc(node->right, ref[node->val%2][flag], ans);
}
};
其他说明:
本题用一个数组ref记录了flag变动的情况:
node->val | flag | newflag |
---|---|---|
偶数 | 0 | 1 |
偶数 | 1 | 3 |
偶数 | 2 | 1 |
偶数 | 3 | 3 |
奇数 | 0 | 0 |
奇数 | 1 | 2 |
奇数 | 2 | 0 |
奇数 | 3 | 2 |
例如:当node->val为偶数时,helpfunc的flag参数如果为0,则对其左右节点调用helpfunc时的flag为1。