对二叉树的各种操作还不太熟....一开始是自己写的程序,然而逻辑有些问题,居然认为必须隔层访问(其实隔两层/三层也是可以的...所以重点是当前访问的结点是否被计入)。
参考了他人的代码,解题思路如下:针对正在访问的结点,两种情况取较大值,(1)当前结点值计入,则结果是左孩子和右孩子不计入时两个子树的count;(2)当前结点值不计入,则结果是左子树两种情况(计入/不计入)下的max加上右子树在两种情况下的max。
代码如下:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int rob(TreeNode* root) { if(root==nullptr) return 0; int sum1, sum2; subRob(root, sum1,sum2); return max(sum1,sum2); } void subRob(TreeNode* startNode, int &sum1, int &sum2){ if(startNode==nullptr) return; int leftSum1 = 0; int leftSum2 = 0; int rightSum1 = 0; int rightSum2 = 0; subRob(startNode->left, leftSum1, leftSum2); subRob(startNode->right, rightSum1, rightSum2); sum1 = startNode->val + leftSum2 + rightSum2; sum2 = max(leftSum1,leftSum2) + max(rightSum1,rightSum2); } };
(更新)
给出一系列非负整数,不能同时取相邻两个元素,求解可能获得的最大累加和。
class Solution { public: int rob(vector<int>& nums) { if(nums.size()==0) return 0; int isCount = nums[0]; int notCount = 0; for(int i=1;i<nums.size();i++){ int preIsCount = isCount; int preNotCount = notCount; isCount = preNotCount+nums[i]; notCount = max(preNotCount,preIsCount); } return max(isCount,notCount); } };