室内设计网站案例,陕西电商网站建设,有没有做废品的网站,wordpress标签管理系统题目描述
小偷又发现了一个新的可行窃的地区。这个地区只有一个入口#xff0c;我们称之为 root 。
除了 root 之外#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两…题目描述
小偷又发现了一个新的可行窃的地区。这个地区只有一个入口我们称之为 root 。
除了 root 之外每栋房子有且只有一个“父“房子与之相连。一番侦察之后聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 房屋将自动报警。
给定二叉树的 root 。返回 在不触动警报的情况下 小偷能够盗取的最高金额 。
示例 1: 输入: root [3,2,3,null,3,null,1]
输出: 7
解释: 小偷一晚能够盗取的最高金额 3 3 1 7示例 2: 输入: root [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 5 9提示
树的节点数在 [1, 104] 范围内0 Node.val 104
解答
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:unordered_mapTreeNode*, int sums; // key 是出发的节点 value是偷到的总金额int rob(TreeNode* root) {// case1: 对于一个以node为根节点的二叉树而言若尝试偷 node节点// 那么一定不能偷取其左右子节点只能尝试左右子节点的左右子节点孙节点// case2: 若不偷取node节点只能尝试偷取其左右子节点// 比较两种方式的结果取大者return tryRob(root);}int tryRob(TreeNode *root){if(root nullptr) return 0;// 若已经计算过该节点出发能偷的最大金额就返回if(sums.count(root)) return sums[root];// 偷取该节点int res1 0;// 尝试偷取其左右子节点的左右子节点if(root-left) // 左边的孙子{res1 (tryRob(root-left-left) tryRob(root-left-right));}if(root-right){res1 (tryRob(root-right-left) tryRob(root-right-right));}res1 root-val; // 偷取该节点加入计算结果// 不偷取root节点只能尝试偷取其左右子节点int res2 tryRob(root-left) tryRob(root-right);sums[root] max(res1, res2);return sums[root];}
};