首页 > 其他分享 >剑指 Offer 34. 二叉树中和为某一值的路径

剑指 Offer 34. 二叉树中和为某一值的路径

时间:2023-08-18 19:22:25浏览次数:40  
标签:node tmp emplace target nullptr 34 que 二叉树 一值

dfs

class Solution {
public: 
    vector<vector<int>> res;
    vector<int> tmp;
    void dfs(TreeNode *node, int target) {
        if(node == nullptr ) return;
        target -= node->val;
        tmp.emplace_back(node->val);

        if(node->left == nullptr && node->right == nullptr && target == 0){
            res.emplace_back(tmp);
        }

        dfs(node->left, target);
        dfs(node->right, target);
        tmp.pop_back(); // 恢复现场
    }

    vector<vector<int>> pathSum(TreeNode* root, int target) {
        if(root == nullptr) return {};

        dfs(root, target);
        return res;
    }
};

bfs

class Solution {
public:
    vector<vector<int>> ret;
    unordered_map<TreeNode*, TreeNode*> parent;

    void getPath(TreeNode* node) {
        vector<int> tmp;
        while(node != nullptr) {
            tmp.emplace_back(node->val);
            node = parent[node];
        }
        reverse(tmp.begin(), tmp.end());
        ret.emplace_back(tmp);
    }
public:
    vector<vector<int>> pathSum(TreeNode* root, int target) {
        if(root == nullptr) return ret;
        queue<TreeNode*> que_node;
        queue<int>que_sum;

        que_node.emplace(root);
        que_sum.emplace(0);

        while(!que_node.empty()){
            TreeNode *node = que_node.front();
            que_node.pop();
            int rec = que_sum.front() + node->val;
            que_sum.pop();
        // 一定要注意这里的if else逻辑关系!
            if(node->left == nullptr && node->right == nullptr) {
                if(rec == target) getPath(node);
            }else{
                if(node->left != nullptr) {
                    parent[node->left] = node;
                    que_node.emplace(node->left);
                    que_sum.emplace(rec);
                }
                if(node->right != nullptr) {
                    parent[node->right] = node;
                    que_node.emplace(node->right);
                    que_sum.emplace(rec);
                }
            }
        }
        return ret;
    }
};

 

标签:node,tmp,emplace,target,nullptr,34,que,二叉树,一值
From: https://www.cnblogs.com/luxiayuai/p/17641426.html

相关文章

  • Gym-103438C Werewolves
    Gym-103438CWerewolves题面有\(n(1\len\le3000)\)个节点的树,每个节点的颜色为\(c_i\)。请计算这个树存在多少不同的连通子图,满足这个连通子图中,存在某种颜色,其出现次数严格大于连通子图中节点数量的一半。简化题意first对于任意一个联通子图,如果该联通子图对答......
  • 判断是否为完全二叉树
    利用层次遍历思想,但结点是否为空不影响入队。当出队时,该结点为空,若队列中仍有不为空的结点,则不是完全二叉树空树也是完全二叉树#include<stdio.h>#include<stdlib.h>#defineMaxSize100typedefstructNode{intdata;structNode*lchild,*rchild;}TreeNode......
  • 【剑指Offer】61、序列化二叉树
    【剑指Offer】61、序列化二叉树题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。解题思路:序列化是指将结构化的对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是指将字节流转回结构化的对象的过程,是序列化的逆过程。受第4题:重建二叉树的启......
  • 平衡二叉树
    110.平衡二叉树-力扣(LeetCode)确定思路如果左右子树都是平衡二叉树,并且左右子树的高度相差不超过1,那么就是平衡二叉树,如果左子树不是平衡二叉树也就不用对右子树进行递归了确定终止条件应该是遍历到叶子节点,因为叶子节点不能构成二叉树了,因为就没有再往下遍历的必要了——......
  • 剑指 Offer 07. 重建二叉树(中等)
    题目:classSolution{//本题思路:利用中序遍历,从前序遍历中找到左、右子树的根节点public:unordered_map<int,int>dic;//创建字典,映射当前根节点在中序遍历中的位置,以便于划分当前根节点的左右子树vector<int>preorder;//即下面的this->preorder......
  • [代码随想录]Day20-二叉树part09
    题目:669.修剪二叉搜索树思路:遍历到的值小于最小值,说明左子树里的所有节点都小于最小值,舍弃左子树。遍历到的值大于最大值,说明右子树里的所有节点都大于最大值,舍弃右子树。如果在范围内,就拼接左右子树然后返回节点代码:/***Definitionforabinarytreenode.*typeTr......
  • arc133,arc134,arc135题解
    ARC133A-EAErasebyValue扣掉一个数当且仅当这个数后面有更小的数。特判单增即可。BDividingSubsequence相对比较有启发性。发现有倍数关系的数对只有\(O(n\logn)\)对,于是可以把对应下标攒成一堆二元组,于是一个合法的取数方案就变成了两个维度分别严格上升的元素集合......
  • 代码随想录算法训练营第十八天| 513.找树左下角的值 112. 路径总和 106.从中序与
     找树左下角的值     卡哥建议:本地递归偏难,反而迭代简单属于模板题, 两种方法掌握一下   题目链接/文章讲解/视频讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html   做题思路:   题目说......
  • 代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子
     卡哥建议:迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。  110.平衡二叉树 (优先掌握递归)   卡哥建议:再一次涉及到,什么是高度,什么是深度,可以巩固一下。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%......
  • 【剑指Offer】58、对称的二叉树
    【剑指Offer】58、对称的二叉树题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路:本题判断一棵树是不是对称的,和第18题可以对比分析:二叉树的镜像,和LeetCode第101题:101.对称二叉树是同一道题。解......