C++实现LeetCode(113.二叉树路径之和之二)

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

[LeetCode] 113. Path Sum II 二叉树路径之和之二

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

For example:
Given the below binary tree and sum = 22,

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

return

[
[5,4,11,2],
[5,8,4,5]
]

这道二叉树路径之和在之前那道题 Path Sum 的基础上又需要找出路径,但是基本思想都一样,还是需要用深度优先搜索 DFS,只不过数据结构相对复杂一点,需要用到二维的 vector,而且每当 DFS 搜索到新结点时,都要保存该结点。而且每当找出一条路径之后,都将这个保存为一维 vector 的路径保存到最终结果二维 vector 中。并且,每当 DFS 搜索到子结点,发现不是路径和时,返回上一个结点时,需要把该结点从一维 vector 中移除,参见代码如下:

解法一:

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int>> res;
        vector<int> out;
        helper(root, sum, out, res);
        return res;
    }
    void helper(TreeNode* node, int sum, vector<int>& out, vector<vector<int>>& res) {
        if (!node) return;
        out.push_back(node->val);
        if (sum == node->val && !node->left && !node->right) {
            res.push_back(out);
        }
        helper(node->left, sum - node->val, out, res);
        helper(node->right, sum - node->val, out, res);
        out.pop_back();
    }
};

下面这种方法是迭代的写法,用的是中序遍历的顺序,参考之前那道 Binary Tree Inorder Traversal,中序遍历本来是要用栈来辅助运算的,由于要取出路径上的结点值,所以用一个 vector 来代替 stack,首先利用 while 循环找到最左子结点,在找的过程中,把路径中的结点值都加起来,这时候取出 vector 中的尾元素,如果其左右子结点都不存在且当前累加值正好等于 sum 了,将这条路径取出来存入结果 res 中,下面的部分是和一般的迭代中序写法有所不同的地方,由于中序遍历的特点,遍历到当前结点的时候,是有两种情况的,有可能此时是从左子结点跳回来的,此时正要去右子结点,则当前的结点值还是算在路径中的;也有可能当前是从右子结点跳回来的,并且此时要跳回上一个结点去,此时就要减去当前结点值,因为其已经不属于路径中的结点了。为了区分这两种情况,这里使用一个额外指针 pre 来指向前一个结点,如果右子结点存在且不等于 pre,直接将指针移到右子结点,反之更新 pre 为 cur,cur 重置为空,val 减去当前结点,st 删掉最后一个结点,参见代码如下:

解法二:

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int>> res;
        vector<TreeNode*> st;
        TreeNode *cur = root, *pre = nullptr;
        int val = 0;
        while (cur || !st.empty()) {
            while (cur) {
                st.push_back(cur);
                val += cur->val;
                cur = cur->left;
            }
            cur = st.back(); 
            if (!cur->left && !cur->right && val == sum) {
                vector<int> v;
                for (auto &a : st) v.push_back(a->val);
                res.push_back(v);
            }
            if (cur->right && cur->right != pre) {
                cur = cur->right;
            } else {
                pre = cur;
                val -= cur->val;
                st.pop_back();
                cur = nullptr;
            }
        }
        return res;
    }
};

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

相关文章

  • C语言代码实现飞机大战

    C语言代码实现飞机大战

    这篇文章主要为大家详细介绍了C语言实现简单飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++结构体数组实现贪吃蛇

    C++结构体数组实现贪吃蛇

    这篇文章主要为大家详细介绍了C++结构体数组实现贪吃蛇,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • opencv实现图像颜色空间转换

    opencv实现图像颜色空间转换

    这篇文章主要为大家详细介绍了opencv实现图像颜色空间转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Qt5.9实现简单的多线程实例(类QThread)

    Qt5.9实现简单的多线程实例(类QThread)

    Qt开启多线程,主要用到类QThread。用一个类继承QThread,然后重新改写虚函数run()。具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • C++优先级队列的使用指南与模拟实现

    C++优先级队列的使用指南与模拟实现

    优先级队列是一种特殊的队列,其中每个元素都有一个与之关联的优先级,优先级较高的元素会在队列中较早地被处理,而优先级较低的元素会在后续处理,本文给大家介绍C++优先级队列的使用指南与模拟实现,需要的朋友可以参考下
    2023-09-09
  • C++如何去掉字符串首尾的空格

    C++如何去掉字符串首尾的空格

    这篇文章主要介绍了C++如何去掉字符串首尾的空格问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++多线程实现TCP服务器端同时和多个客户端通信

    C++多线程实现TCP服务器端同时和多个客户端通信

    通讯建立后首先由服务器端发送消息,客户端接收消息;接着客户端发送消息,服务器端接收消息,实现交互发送消息。本文主要介绍了C++多线程实现TCP服务器端同时和多个客户端通信,感兴趣的可以了解一下
    2021-05-05
  • C++学习之cstdbool和cstddef头文件封装源码分析

    C++学习之cstdbool和cstddef头文件封装源码分析

    这篇文章主要为大家介绍了C++学习之cstdbool和cstddef头文件封装源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • C++设计模式之工厂模式

    C++设计模式之工厂模式

    本文是C++设计模式系列文章的第一篇,主要给大家讲述下工厂模式,非常的简单实用,有需要的小伙伴可以参考下
    2016-05-05
  • C/C++ Qt Dialog 对话框组件应用技巧

    C/C++ Qt Dialog 对话框组件应用技巧

    这篇文章主要介绍了C/C++ Qt Dialog 对话框组件应用,这里我将总结本人在开发过程中常用到的标准对话框的使用技巧,对C++ 对话框组件相关知识感兴趣的朋友一起看看吧
    2021-11-11

最新评论