-
比较有意思的一道题目。当抢劫一个节点的时候,它的左右子节点肯定不可以抢。当不抢劫一个节点的时候,它的左右子节点可抢,可不抢。我们在处理的过程中取最大值即可。
#include
#include
#include
#include
#include
using namespace std;
struct TreeNode
{
int val;
TreeNode lChild;
TreeNode rChild;
TreeNode(int val, TreeNodel = nullptr, TreeNoder = nullptr)
{
this->val = val;
this->lChild = l;
this->rChild = r;
}
};
TreeNode *create(int intarr[], int length, int i)
{
TreeNode *node = nullptr;if (i < length && intarr[i] != -1)
{
node = new TreeNode(intarr[i]);
node->lChild = create(intarr, length, i * 2 + 1);
node->rChild = create(intarr, length, i * 2 + 2);
}
return node;
}
int maxT(int a, int b)
{
if (a > b)
{
return a;
}
return b;
}
int robberNode(TreeNode *node);
int NotRobberNode(TreeNode *node)
{
if (node == nullptr)
{
return 0;
}
return maxT(robberNode(node->lChild) + robberNode(node->rChild),
NotRobberNode(node->lChild) + NotRobberNode(node->rChild));
}
int robberNode(TreeNode *node)
{
if (node == nullptr)
{
return 0;
}
return node->val+ NotRobberNode(node->lChild)+ NotRobberNode(node->rChild);
}
int getRobberMax(TreeNode *root)
{
return maxT(robberNode(root), NotRobberNode(root));
}
int main()
{
int arr[7] = { 3,2,3,-1,3,-1,1};
TreeNode *root = create(arr, 7, 0);
cout << getRobberMax(root) << endl;
system(“pause”);
return 0;
}