遞迴求解
本質上就是間隔遍歷把問題直接簡化成兩個部分:
①偷父節點。那就是隔行遍歷左右節點,因為不能偷連續的節點。但是注意,隔行遍歷一定要判斷有無空指標!
②不偷父節點。可以畫幾個示意圖看看,不偷父節點的話就是父節點的左子樹+右子樹的值,依次加下去
最後返回乙個最大的金額
class
solution
if(root-
>left==
nullptr
&&root-
>right==
nullptr
)//偷父節點的
int cash1=root-
>val;
int cash2=0;
if(root-
>left!=
nullptr)if
(root-
>right!=
nullptr
)//不偷父節點
cash2+
=rob
(root-
>left)
+rob
(root-
>right)
;return cash1>cash2?cash1:cash2;}}
;
LeetCode337 打家劫舍
在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。計...
leetcode 337打家劫舍 樹dp
class solution def rob self,root treenode int 最大問題分解為 在樹中,最常見的就是不斷劃分子樹 所以找每乙個節點的字數最大 維護兩個全域性字典 f g f none 0 g none 0 f means choose this node,g means ...
leetcode337打家劫舍III
不搶劫該節點,則可以搶劫該節點的左右字節點 注意,node節點不搶不意味著一定要搶它的左右子結點,所以在方法中應該呼叫rob方法,而不是robinclude方法 public int robexclude treenode node return rob node.left rob node.rig...