Tree Path Sum III

https://leetcode.com/problemset/algorithms/
题意是在一颗树中统计 多个连续节点的和等于某一个值sum的组合数(相邻节点必须是父子关系)

我的思路是 递归返回一个数组记录一个节点所对应的各条路径对应的和
例如树[1,2,3,4,5,6,7]
1
2 3
4 5 6 7
以节点2为例以它为起点的路径所有节点的和分别为2、2+4、2+5三种选择,对应数组[2,6,7],同理以节点3为起点对应的数组是[3,9,10]。如果以节点1为起点则它的“路径和”分别为1,1+2,1+6,1+7
,1+3,1+9,1+10 [1,3,7,8,4,10,11]。然后可以通过统计每个节点对应的路径和中与sum相等的个数。

class Solution {
public:
    int result;
    int pathSum(TreeNode* root, int sum) {
        recusion(root, sum);
        return result;
    }
    
    vector<int> recusion(TreeNode* root, int sum){
         vector<int> vecAll;//供父节点选择
         if(root == NULL){
            return vecAll;
         }
        
         if(root->val == sum){
            result++;   
         }
        
         if((root->right == NULL)&&(root->left == NULL)){
            vecAll.push_back(root->val);
            return vecAll;
         }
        
         vector<int> vecLeft = recusion(root->left, sum);
         vector<int> vecRight = recusion(root->right, sum);
       
         vecLeft.insert(vecLeft.end(), vecRight.begin(), vecRight.end()); 
         vecAll = vecLeft;
        
        for(vector<int>::iterator it = vecAll.begin(); it!=vecAll.end(); it++)
      {
            int i = *it;
            int jude = root->val+i;
            if(jude == sum){
                result++;
            }
            *it = *it+root->val;
        }
        vecAll.push_back(root->val);
        return vecAll;
    }
};

下面是一个更巧妙的算法。是从头节点为起点计算各种符合条件的“路径和”。sumUp方法通过递归计算出以对应节点root为起点所对应的所有的符合条件的路径的数目,然后通过pathSum递归计算出以root节点的子节点为起点符合条件的路径数目,后将统计出的相加便是最后的结果。

class Solution {
public:
    int pathSum(TreeNode* root, int sum) {
        if(!root) return 0;
        return sumUp(root, 0, sum) + pathSum(root->left, sum) + pathSum(root->right, sum);
    }
private:
    int sumUp(TreeNode* root, int pre, int& sum){
        if(!root) return 0;
        int current = pre + root->val;
        return (current == sum) + sumUp(root->left, current, sum) + sumUp(root->right, current, sum);
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,076评论 0 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,434评论 1 31
  • 昨天下午举行了拔河比赛,这是我读研期间的第二次参加比赛了。记得去年的时候,我还只是一个被抓到场上充人数的背...
    术算天下阅读 609评论 4 4
  • 就像爱与不爱,吃醋也是一个永恒的话题。 饿到胃痛,我躺在床上挣扎着下周的结业考试,脑子里一片空白。闭上眼,想的又全...
    大理没有你阅读 987评论 0 1