题解 | #二叉树中是否存在节点和为指定值的路径#

二叉树中是否存在节点和为指定值的路径

http://www.nowcoder.com/practice/508378c0823c423baa723ce448cbfd0c

题解一:先序遍历
解题思路:
1.对树进行先序遍历。使用ans路径和。
2.如果ans> sum 或者ans!=sum&&到达叶子节点,那么就回溯(剪枝)
3. 找到合法路径,返回true;
图示:
图片说明
复杂度分析:
时间复杂度:O(N),二叉树的节点数N
空间复杂度:O(N),二叉树退化成链表的特殊情况,需要遍历整个树
实现如下:

class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @param sum int整型
     * @return bool布尔型
     */
    bool hasPathSum(TreeNode* root, int sum) {
        // write code here
        if(!root) return false;//特判根节点为空的情况;
        return pre_order(root,sum,0);
    }
    bool pre_order(TreeNode* root,int sum, int ans){
        if(!root) return false;//先序遍历终止条件;
        ans += root->val;//累和
        if(!root->left&&!root->right&&ans == sum) return true;//当前节点为子节点,并且和为sum,存在节点和为指定值的路径;
        return pre_order(root->left, sum, ans) || pre_order(root->right, sum, ans);//分支分别从左右节点判断是否存在;
    }
};

题解二: 层次遍历
题解思路: 对树进行层次遍历,遍历到叶节点,判断是否有合法路径。
算法分析:
1.首先自定义结构path_sum{TreeNode*, cur_sum},表示到节点的路径和。
2. 每次遍历一个节点,将当前节点的val值加上父节点的cur_sum,创建一个path_sum加入队列中。
3.如果到了叶节点,某个path_sum的cur_sum属性等于sum的值。
图示:
图片说明

复杂度分析:
时间复杂度:O(N),最坏为树退化为链表
空间复杂度:O(N),二叉树退化成链表的特殊情况,需要遍历整个树

实现如下:

class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @param sum int整型
     * @return bool布尔型
     */
    struct path_sum{
        TreeNode* node;
        int cur_sum;
        path_sum(TreeNode* root = NULL, int value = 0):node(root),cur_sum(value){};
    };//自定义path_sum 用于表示到节点的路径和

    bool hasPathSum(TreeNode* root, int sum) {
        if(!root) return false;
        queue<path_sum*> q;
        path_sum* head = new path_sum(root,root->val);  //以头节点构造一个path_sum
        q.push(head);
        //队列不为空
        while(!q.empty()){
            path_sum* tmp = q.front(); // 取出一个path_sum
            q.pop();
            if(tmp->node->left==NULL&&tmp->node->right==NULL) //如果为叶子节点
            {
                if(tmp->cur_sum==sum) return true; //判断与sum的关系
            }else{
                if(tmp->node->left)//如果具有左节点
                {
                    int left_sum = tmp->node->left->val+tmp->cur_sum;
                    path_sum* left = new path_sum(tmp->node->left,left_sum);
                    q.push(left);
                }
                if(tmp->node->right)//如果有右节点
                {
                    int right_sum = tmp->node->right->val+tmp->cur_sum;
                    path_sum* right = new path_sum(tmp->node->right,right_sum);
                    q.push(right);
                }    
            }
        }
        return false;
    }
};
牛客网编程题题解 文章被收录于专栏

本专栏记录在牛客网上AC的每一题,写下题解。 未来2年完成2000编程题的题解。 2021.12.29更新,最进准备毕设,断更了,会尽快做完毕设,继续做这一件事情

全部评论

相关推荐

05-29 19:16
已编辑
福建农林大学 测试开发
努力勤奋的马洛格已躺...:翻译:面试前没盘点好hc一下面太多了,现在在排序回去等通知
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-26 15:37
1、这群人晚上&nbsp;11&nbsp;点发朋友圈:"凌晨&nbsp;11&nbsp;点,三环的灯还亮着。"&nbsp;实际下班时间:19:30。2、什么是嘉豪呀?我最近在字节实习,没什么时间上网3、同龄人:学校社团、酒吧蹦迪;我:acm、字节/腾讯实习4、别人朋友圈发:“今天不想上课”;我朋友圈发:“今天的班就上到这里啦”,定位:字节跳动5、别人的朋友圈都是到处旅游的定位,我的朋友圈天天都是“字节定位”,还一定要是在【公司的健身房】里拍张照片,实际只练了10分钟,其中凹造型5分钟6、mentor布置任务的时候,别人都是:”好的收到“,我:”是不是要xxxx,xxxx这么做也可以吧,这个技术方案会不会更好些“7、别人书包里装的:王道408、轻薄本、四六级真题。我书包里面装的:显存24GB4090独显gpu(24小时开机运行,屏幕上贴着“字节/腾讯等贴纸”)、速效救心丸(代码报错用)、电棍(熬夜写代码困了用),就很……你们懂吧8、入职大厂第一件事:发朋友圈、发小红书,晒工牌,985计算机硕|字节实习生|可以接咨询|有偿改简历,9、别人的社交软件简介:25岁|男|希望遇见有趣的灵魂;嘉豪的社交软件简介:25岁|程序员|字节跳动工程师|一张佩戴工牌的自拍照大厂嘉豪标配:1.&nbsp;挂胸前的工牌(地铁里只挂不收,怕你看不见&nbsp;logo)2.&nbsp;降噪耳机(不放音乐也戴着,避免别人跟自己说话)3.&nbsp;印&nbsp;logo&nbsp;的电脑包(字节红&nbsp;/&nbsp;腾讯蓝&nbsp;/&nbsp;阿里橙&nbsp;/&nbsp;美团黄)4.&nbsp;手表(最好显示心率,午饭后必发"步数已破&nbsp;6,000")
布布永不言弃:可曾见过“我在未上市小厂实习,丢人了xxx”,然后接着说“这个小厂的创始人是张一鸣” 然后别人要是真不认识张一鸣 就直接急了
点赞 评论 收藏
分享
评论
9
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务