問題描述:在上次大街萬一條街道之后和一圈房屋后,小偷又發現了一個新的可行竊的地區。這個地區只有一個入口,我們稱之為根。除了根之外,每棟房子有且只有一個父房子與之項鏈,一番偵查之后,聰明的小偷意識到這個地方的所有房屋的排列類似于一顆二叉樹,如果兩個直接項鏈的房子在同一天北大街,房屋將自動報警,計算在不觸動警報的情況下,小偷一晚上能夠盜取的最高金額;
遞歸求解分析:采用一個參數表征父節點是否選取,若沒有偷父節點,則子節點有選和不選兩種情況,若偷了父節點,則只能不選該節點,最后比較選根節點和不選根結點的最大值返回;
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);
}