问题描述:在上次大街万一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为根。除了根之外,每栋房子有且只有一个父房子与之项链,一番侦查之后,聪明的小偷意识到这个地方的所有房屋的排列类似于一颗二叉树,如果两个直接项链的房子在同一天北大街,房屋将自动报警,计算在不触动警报的情况下,小偷一晚上能够盗取的最高金额;
递归求解分析:采用一个参数表征父节点是否选取,若没有偷父节点,则子节点有选和不选两种情况,若偷了父节点,则只能不选该节点,最后比较选根节点和不选根结点的最大值返回;
private int maxProfit(TreeNode node,int ischooseparent)
{
//如果当前节点为null,则返回0
if(node==null)
{
return 0;
}
//如果选择了父节点,则当前节点不能选择,只能向下选择,
if(ischooseparent)
{
return maxProfit(node.left,false)+maxProfit(node.left,false);
}
else
{
//没有的话,可以选择父节点和不选择父节点两种情况,并取最大值返回
return Math.max(node.val+maxProfit(node.left,true)+maxProfit(node.right,false),maxProfit(node.left,false)+maxProfit(node.left,false))
}
}public int MaxProfit(TreeNode node )
{
//从根节点开始递归遍历,且在这之前没有选择根结点的父节点,从而传值为false
return maxProfit(node,false);
}