leetcode_337. House Robber III 大盗抢劫,房子是二叉树形式,深度优先遍历
2016-11-30 16:31
453 查看
题目:
The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place
forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example 1:
Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Example 2:
Maximum amount of money the thief can rob = 4 + 5 = 9.
题意:
房子是二叉树形式,不能偷直连(父子形式)的房子,求偷盗的最大金钱数。
代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def dfs(self, root) : #深度优先遍历二叉树
if not root :
return [0, 0]
robLeft = self.dfs(root.left) #左子树的偷盗情况,是一个二元组,第一个元素是不偷这个节点,第二个元素是偷这个节点
robRight = self.dfs(root.right) #右子树的偷盗情况,是一个二元组,第一个元素是不偷这个节点,第二个元素是偷这个节点
norobCur = robLeft[1] + robRight[1] #求不偷当前节点时金额最大值,为偷孩子节点的金钱数,包括偷左孩子和偷右孩子,当前节点一定不能偷,否则会报警
robCur = max(robLeft[0] + robRight[0] + root.val, norobCur) #求偷当前节点时金额最大值,实际可以偷,也可以不偷,(如果不偷,则可以连续两个节点都不偷,这是关键)。当前节点的最大值,就为偷该节点与不偷该节点的最大值。其实这里偷包含了不偷的情况
return [norobCur, robCur]
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""
lis = [0,0] #二元组,lis[0]表示不偷当前节点,lis[1]表示偷当前节点
lis = self.dfs(root)
return max(lis) #返回偷与不偷根节点的最大值
笔记:
深度优先遍历啊!
参考的是网上的代码
robCur = max(robLeft[0] + robRight[0] + root.val, norobCur) 这个理解起来不那么直观,还是没怎么理解。这是这个题的关键。
The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place
forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example 1:
3 / \ 2 3 \ \ 3 1
Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Example 2:
3 / \ 4 5 / \ \ 1 3 1
Maximum amount of money the thief can rob = 4 + 5 = 9.
题意:
房子是二叉树形式,不能偷直连(父子形式)的房子,求偷盗的最大金钱数。
代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def dfs(self, root) : #深度优先遍历二叉树
if not root :
return [0, 0]
robLeft = self.dfs(root.left) #左子树的偷盗情况,是一个二元组,第一个元素是不偷这个节点,第二个元素是偷这个节点
robRight = self.dfs(root.right) #右子树的偷盗情况,是一个二元组,第一个元素是不偷这个节点,第二个元素是偷这个节点
norobCur = robLeft[1] + robRight[1] #求不偷当前节点时金额最大值,为偷孩子节点的金钱数,包括偷左孩子和偷右孩子,当前节点一定不能偷,否则会报警
robCur = max(robLeft[0] + robRight[0] + root.val, norobCur) #求偷当前节点时金额最大值,实际可以偷,也可以不偷,(如果不偷,则可以连续两个节点都不偷,这是关键)。当前节点的最大值,就为偷该节点与不偷该节点的最大值。其实这里偷包含了不偷的情况
return [norobCur, robCur]
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""
lis = [0,0] #二元组,lis[0]表示不偷当前节点,lis[1]表示偷当前节点
lis = self.dfs(root)
return max(lis) #返回偷与不偷根节点的最大值
笔记:
深度优先遍历啊!
参考的是网上的代码
robCur = max(robLeft[0] + robRight[0] + root.val, norobCur) 这个理解起来不那么直观,还是没怎么理解。这是这个题的关键。
相关文章推荐
- leetcode 297. Serialize and Deserialize Binary Tree 二叉树的序列化和反序列化 + 深度优先遍历DFS
- leetcode 100. Same Tree 二叉树DFS深度优先遍历
- leetcode 617. Merge Two Binary Trees 二叉树合并 + 深度优先遍历DFS
- Java 递归形式深度优先遍历二叉树
- leetcode 687. Longest Univalue Path 二叉树最长相等路径+ 深度优先遍历DFS
- leetcode 655. Print Binary Tree 矩形打印二叉树 + 深度优先遍历DFS
- leetcode 236. Lowest Common Ancestor of a Binary Tree 最近公告祖先LCA + 二叉树 + 深度优先遍历DFS
- leetcode 662. Maximum Width of Binary Tree 二叉树最大宽度 + 深度优先遍历DFS
- 二叉树的深度优先和广度优先遍历
- 【leetcode Java】二叉树的递归遍历以及最大深度的求解(Java)
- 二叉树的深度优先和广度优先遍历
- 二叉树的遍历,深度优先遍历和广度优先遍历
- 二叉树的深度优先和广度优先遍历
- LeetCode Binary Tree Right Side View : 思想上的基于队列的广度优先遍历,形式上的一个简单变种
- 二叉树的深度优先和广度优先遍历
- 构建二叉树、二叉树的深度、广度优先遍历
- 二叉树的遍历(深度优先)
- 二叉树的深度优先和广度优先遍历
- 二叉树的深度优先遍历、广度优先遍历和非递归遍历、图的深度优先和广度优先遍历
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)