問題描述:每棟別墅以二叉樹的結構建立,每個節點的值是財富值,小偷不能夠偷相接的別墅,問小偷最多能夠偷多少財富值?
有個規律:每乙個節點的偷值都是:左側子節點的不偷值+右側子節點的不偷值+該節點的值;不偷值:左側子節點的最大值+右側子節點的最大值。我們可以先深度優先遍歷到每乙個葉子節點,再依此計算。
class主要考察建模能力以及實現能力。treenode:
de __init(self,x,left=none,right=none):
self.val=x
self.left=left
self.right=right
t3=treenode(1);t4=treenode(3);t6=treenode(1
)t1=treenode(4,t3,t4);t2=treenode(5,left=none,right=t6)
root=treenode(3
,t1,t2)
def rob(root):
a=helper(root)
return max(a[0],a[1
])def helper(root):
if root ==none:
return (0,0
) left=helper(root.left)
right=helper(root.right)
robval=rot.val+left[1]+right[1
] skipval=max(left[0],left[1])+max(right[0],right[1
])
return (robval,skipval)
輸出:9
深度優先遍歷 廣度優先遍歷
用棧進行儲存元素。訪問頂點 頂點入棧,以便記住它 標記頂點,以便不會再訪問它 2 訪問規則 a.如果可能,訪問乙個鄰接的未訪問頂點,標記它,併入棧。b.當不能執行a時 沒有鄰接的未訪問頂點 如果棧不為空,就從棧中彈出乙個頂點。c.如果不能執行規則a和b,就完成了整個搜尋過程。3 實現 基於以上規則,...
深度優先遍歷
第一步 從開始節點查詢可達節點,如果有沒到過的可達節點則第二部,否則第三步 第二部 便利到下乙個可達節點,記錄下該節點已經到達節點 第三步 回到上一步的節點再從第一步開始 乙個節點對應他的可達節點用map表示,map的key和value分別是integer和list 用來存放key對應的節點 遍歷過...
深度優先遍歷
深度優先遍歷很容易列出所有可能 這裡我們分情況 標註幾個易錯的點 不重複組合 不重複組合 則表明 如果我們取k 3 取n1 n2 n3 則n1從1 9中任取 但n1需要排除n1 同理n3需要排除n1 n2 如下 public static void dfs3 int start,listnums,l...