采用深度优先搜索,定义一个函数DFS,函数通过引用返回两个值,rob root节点能够得到的最大金钱r1,以及不rob root节点能够得到的最大金钱r2。代码如下:
void DFS(TreeNode* root,int &r1,int &r2)
{
int lr1=0,lr2=0,rr1=0,rr2=0;
if(root->left!=NULL) DFS(root->left,lr1,lr2);
if(root->right!=NULL) DFS(root->right,rr1,rr2);
r1 = lr2+root->val+rr2;//rob the root
r2 = max(lr1,lr2)+max(rr1,rr2);// not rob the root
}
int rob(TreeNode* root) {
if(root==NULL) return 0;
int r1=0,r2=0;
DFS(root,r1,r2);
return max(r1,r2);
}