C++实现LeetCode(112.二叉树的路径和)

 更新时间:2021年07月15日 09:50:25   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(112.二叉树的路径和),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 112. Path Sum 二叉树的路径和

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

Note: A leaf is a node with no children.

Example:

Given the below binary tree and sum = 22,

      5
/ \
4   8
/   / \
11  13  4
/  \      \
7    2      1

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

这道题给了一棵二叉树,问是否存在一条从跟结点到叶结点到路径,使得经过到结点值之和为一个给定的 sum 值,这里需要用深度优先算法 DFS 的思想来遍历每一条完整的路径,也就是利用递归不停找子结点的左右子结点,而调用递归函数的参数只有当前结点和 sum 值。首先,如果输入的是一个空结点,则直接返回 false,如果如果输入的只有一个根结点,则比较当前根结点的值和参数 sum 值是否相同,若相同,返回 true,否则 false。 这个条件也是递归的终止条件。下面就要开始递归了,由于函数的返回值是 Ture/False,可以同时两个方向一起递归,中间用或 || 连接,只要有一个是 True,整个结果就是 True。递归左右结点时,这时候的 sum 值应该是原 sum 值减去当前结点的值,参见代码如下:

解法一:

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if (!root) return false;
        if (!root->left && !root->right && root->val == sum ) return true;
        return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
    }
};

我们也可以使用迭代的写法,这里用的也是先序遍历的迭代写法,先序遍历二叉树,左右子结点都需要加上其父结点值,这样当遍历到叶结点时,如果和 sum 相等了,那么就说明一定有一条从 root 过来的路径。注意这里不必一定要先处理右子结点,调换下顺序也是可以的,因为不论是先序遍历的根-左-右,还是根-右-左,并不会影响到找路径,参见代码如下:

解法二:

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if (!root) return false;
        stack<TreeNode*> st{{root}};
        while (!st.empty()) {
            TreeNode *t = st.top(); st.pop();
            if (!t->left && !t->right) {
                if (t->val == sum) return true;
            }
            if (t->right) {
                t->right->val += t->val;
                st.push(t->right);
            }
            if (t->left) {
                t->left->val += t->val;
                st.push(t->left);
            }
        }
        return false;
    }
};

到此这篇关于C++实现LeetCode(112.二叉树的路径和)的文章就介绍到这了,更多相关C++实现二叉树的路径和内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++11多线程编程之std::async的介绍与实例

    c++11多线程编程之std::async的介绍与实例

    这篇文章主要给大家介绍了关于c++11多线程编程之std::async的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C++输出斐波那契数列的两种实现方法

    C++输出斐波那契数列的两种实现方法

    以下是对C++中输出斐波那契数列的两种实现方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C语言中程序如何调用Python脚本

    C语言中程序如何调用Python脚本

    由于python有很多功能强大的开源库,有时候在写C语言程序的时候又想利用一下python强大的模块,那么C语言中程序如何调用Python脚本,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言中的指针 初阶

    C语言中的指针 初阶

    这篇文章主要介绍的是关于初级阶段学习C语言中指针的一些内容,那就是指针是什么?简单的说,就是通过它能找到以它为地址的内存单元。下面文章我们就来详细介绍该内容,需要的朋友可以参考一下
    2021-10-10
  • C BlowFish对称加密算法详解

    C BlowFish对称加密算法详解

    这篇文章主要介绍了C BlowFish对称加密算法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++空类及没有成员变量的类的大小实例分析

    C++空类及没有成员变量的类的大小实例分析

    这篇文章主要介绍了C++空类及没有成员变量的类的大小,对于初学者更好的了解C++的指针及类的存储结构很有帮助,需要的朋友可以参考下
    2014-07-07
  • QT中start()和startTimer()的区别小结

    QT中start()和startTimer()的区别小结

    QTimer提供了定时器信号和单触发定时器,本文主要介绍了QT中start()和startTimer()的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • C++标准库介绍及使用string类的详细过程

    C++标准库介绍及使用string类的详细过程

    C++中将string封装为单独的类,string 类是 C++ 标准库中的一个非常重要的类,用于表示和操作字符串,这篇文章主要介绍了C++标准库介绍及使用string类,需要的朋友可以参考下
    2024-08-08
  • C++ XML库用法详解

    C++ XML库用法详解

    TinyXML-2是C++中一个轻量级、易于使用的XML解析库,支持XML的读取和写入,内存占用小,适合嵌入式系统,本文给大家介绍C++ XML库用法,感兴趣的朋友一起看看吧
    2025-03-03
  • 关于C++中sort()函数的用法,你搞明白了没

    关于C++中sort()函数的用法,你搞明白了没

    这篇文章主要介绍了关于C++中sort()函数的用法,并通过三种方法介绍了按降序排列的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论