Leetcode Problem 337: House Robber III

一个二叉树,每个节点有一个正整数数值。存在某个节点子集,使得其中节点对应的数值的和最大,前提:如果某节点在此子集中,其直接父亲节点和直接儿子节点不得出现在此子集中。求这个最大值。

动态规划。

最大值一定是在下面两种情况之一:根节点在子集中,但根节点的直接儿子节点不在子集中;根节点不在子集中。即最大值要么是根节点的所有孙子节点(儿子节点的儿子节点,最多4个)的最大值之和加上根节点的值,要么是两个儿子节点的最大值之和。显然计算子树最大值的方法是可以递归的,递归的终结状态是空树(最大值为0)。

请注意,上述方法中,某个节点为根节点的子树的最大值要求多次,所以要使用填表法来避免重复运算。

  • 空间复杂度:O(n) n为节点个数
  • 时间复杂度:O(n)
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    map<TreeNode*, int> table;
    
public:
    int rob(TreeNode* root) {
        if (root == NULL) {
            return 0;
        }
        
        if (table.find(root) != table.end()) {
            return table[root];
        }
        
        int a = root->val;
        
        if (root->left != NULL) {
            a += rob(root->left->left);
            a += rob(root->left->right);
        }
        if (root->right != NULL) {
            a += rob(root->right->left);
            a += rob(root->right->right);
        }
        
        int b = rob(root->left) + rob(root->right);
        
        int max = (a > b) ? a : b;
        table.insert(pair<TreeNode*, int> (root, max));
        return max;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,475评论 1 31
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,138评论 0 12
  • 东转西晃的结局 促成偶然的相遇 刚开始的陌生与不熟悉 到后来相视一笑的默契 虽然互相依旧都不了解彼此的底细 但对于...
    BULABULA小八阅读 249评论 4 1
  • 好想妈妈,明天晚上回家,好想时间倒退十年,家还是原来的家,我还是原来的我
    yezi1989阅读 184评论 0 0
  • 折腾了一天,累了。什么都不想说。
    夜未央盼花香浓阅读 122评论 0 0