保存一棵树根到叶子之和为给定值的所有路径的BFS解法

BFS是较为直观的解法。缺点是要借用不少数据结构的帮忙,也许可以想办法避免。

在需要树的路径时,往往会重新搞一个数据结构,保存子->父的回溯链,这个容易实现。

但确实浪费了时间和空间,避免方法之一是冗余存储。每个节点中按顺序存储所有祖先节点信息。

如此, 当该节点被选中时,它的祖先自然也就确定了。本题的数字可以用一分隔符,例如“#”分割,以完成最后的答案的构造。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int> > pathSum(TreeNode *root, int sum) {
        vector<vector<int>> res;
        vector<int> path;
        TreeNode *tmp;

        if(!root) return res;

        queue<pair<TreeNode *,int>> q;
        unordered_map<TreeNode*,TreeNode *> parent;
        parent[root]=nullptr;
        q.push(make_pair(root,root->val));

        while(!q.empty()){
            auto tmp=q.front(); q.pop();
            auto node = tmp.first;
            auto num = tmp.second;

            if(!node->left&&!node->right){
                if(num==sum){
                    while(node!=nullptr){
                        path.push_back(node->val);
                        node=parent[node];
                    }
                    reverse(path.begin(),path.end());
                    res.push_back(path);
                    path.clear();
                }
                continue;
            }

            if(node->left){
                q.push(make_pair(node->left,num+node->left->val));
                parent[node->left]=node;
            }

            if(node->right){
                q.push(make_pair(node->right,num+node->right->val));
                parent[node->right]=node;
            }
        }

        return res;

    }
};
时间: 2025-01-06 10:05:57

保存一棵树根到叶子之和为给定值的所有路径的BFS解法的相关文章

保存一棵树根到叶子之和为给定值的所有路径的DFS解法

这道题目DFS用得非常不自信. (1)递归的用得不够大胆,过分考虑细节了,应该站得高些. (2)思路厘清之后,要注意状态值的修改,就是状态恢复.深度优先走到底之后,需要返回,此时对应的状态也应该返回.例如之前放到堆栈/vector里的状态数据要弹出来. /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : va

输出二叉树中路径上结点值之和为给定值的所有路径

#include<iostream>#include<vector>#include<algorithm>#include<stdint.h>using namespace std;#include<list>#include<map>#include<queue>struct node{ int val; node* left, *right; node(int _val) :val(_val), left(NULL),

404 Sum of Left Leaves 左叶子之和

计算给定二叉树的所有左叶子之和.示例:    3   / \  9  20    /  \   15   7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24. 详见:https://leetcode.com/problems/sum-of-left-leaves/description/ C++: 方法一: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *le

【leetcode 简单】 第九十四题 左叶子之和

计算给定二叉树的所有左叶子之和. 示例: 3 / 9 20 / 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def sumOfLeft

[Swift]LeetCode404. 左叶子之和 | Sum of Left Leaves

Find the sum of all left leaves in a given binary tree. Example: 3 / 9 20 / 15 7 There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24. 计算给定二叉树的所有左叶子之和. 示例: 3 / 9 20 / 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 1 /**

【算法】求二叉树各路径结点之和并找出最大值的路径

说在前面的话 最近没事将大学里的<数据结构>(严蔚敏,吴伟民著)一书重拾温习,受益颇多,才发现工作之中诸多经验问题都找到了理论支撑. 当时觉得没用的书,现在只能嘲笑当时得多low... 现在依然很low... --! 事件背景 因实际工作中,遇到一个关于权重的问题,需要将数据关系中最大权重的路径找到,然后就想到了<数据结构>中的DFS... 此事勾起了我码砖的激情,让我本已平静的心再次荡漾... 为了简单说明这个问题,我就拿个二叉树的模型来叙述一下我要达成的目标 CASE Exam

设计一个算法,输出从每个叶子节点到根节点的逆路径

下面使用三种遍历方法输出逆路径,假设二叉树采用二叉链存储结构存储. 方法1:采用基于层次遍历的方法,设计的队列为非环形顺序队列,将所有已扫描的节点指针进队,并在队列中保存双亲节点的位置.当找到一个叶子节点时,在队列中通过双亲节点的位置输出该叶子节点到根节点的逆路径.对应的算法如下: void AllPath(BTNode * b) { struct snode { BTNode *node; //存放当前节点指针 int parent; //存放双亲节点在队列中的位置 } Qu[MaxSize]

找出数组中两数之和为指定值的所有整数对

一,问题描述 给定一个整型数组(数组中的元素可重复),以及一个指定的值.打印出数组中两数之和为指定值的 所有整数对 二,算法分析 一共有两种方法来求解.方法一借助排序,方法二采用HashSet 方法一: 先将整型数组排序,排序之后定义两个指针left和right.left指向已排序数组中的第一个元素,right指向已排序数组中的最后一个元素 将 arr[left]+arr[right]与 给定的元素比较,若前者大,right--:若前者小,left++:若相等,则找到了一对整数之和为指定值的元素

leetcode 404 左叶子之和 Sum of Left Leaves

C++ 递归遍历+判断左叶子节点,效率不高, 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 int