经典的选或者不选问题。这个问题应该是自底向上的一个过程,因为我们最终只看根节点状态就可以知道结果,而不用统计所有底部信息,是较为方便的。
之后我们考虑dp数组怎么存,一种使用树形数组存,另外就是dfs过程中存。对于这个题,dfs是一种很方便的方式,前序遍历就很方便,左右处理完后,中间看两边取或者不取的状态的最优值,这个和普通的打家劫舍定义不太一样。普通的一个数就记录了,这边要两个数,还是比较有趣的,也不用看上一个,思想相当于后序遍历。
/**
* 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:
vector