【LeetCode】二叉树的路径问题(所有路径,路径之和)

本文探讨了二叉树的路径问题,包括回溯法和递归、迭代的解决方案。详细介绍了如何利用前序遍历和两个栈来找到所有路径、路径总和以及根到叶子节点的数字之和。同时还涉及了如何处理左叶子节点的问题。
摘要由CSDN通过智能技术生成
  • 路径问题涉及回溯
  • 回溯一般和递归捆绑在一起
  1. 一般递归函数为void型
  2. 参数有结点,结果类型的一个遍历变量,(如果需要存放路径)定义一个容器存放
  3. 函数体首先第一步把结点值放入遍历变量中,然后判断是否是叶结点,是则进行相应处理,并且return;
  4. 如果不是则递归(遍历变量还是path,函数中处理),并且回溯;
  • 迭代法中的回溯一般使用两个栈来模拟
  1. 一个栈用来遍历二叉树;
  2. 一个栈用来模拟递归用来存放和当前结点对应的已经遍历的路径;
  3. 同时pop更新,同时压入栈(结点,当前路径(注意会改变变量的情况,设置tmp变量)),如果叶结点则处理。

257. 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例:

输入:

   1
 /   \
2     3
 \
  5

输出: ["1->2->5", "1->3"]

解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
通过次数79,782提交次数120,766

递归法思路:用前序遍历,但是每次遍历都需要回溯

vector<string> binaryTreePaths(TreeNode* root) {
   
        vector<string> result;
        vector<int> path;
        if(root==NULL) return result;
        traversal(root,path,result);
        return result;
    }
    //求的路径 从上到下遍历 用前序遍历 返回值为空
    //参数分别为当前路径 总结果 当前结点
    //定义成引用 
    void traversal(TreeNode* cur,vector<int>& path,vector<string>& result){
   
        path.push_back(cur->val);
        //返回条件
        if(cur->left==NULL&&cur->right==NULL){
   
            string tmp;
            for(int i=0;i<path.size()-1;i++){
   
                tmp+=to_string(path[i]);
                tmp+="->";
            }
            tmp+=to_string(path[path.size()-1]);
            result.push_back(tmp);
            return;//不用返回值,直接return 结果都存好了
        }
        if(cur->left){
   
           traversal(cur->left,path,result);
           path.pop_back();//递归和回溯一定要绑定在一起
        }
        if(cur->right){
   
           traversal(cur->right,path,result);
           path.pop_back();//递归和回溯一定要绑定在一起
        }

    }

迭代法思路:两个栈来做

vector<string> binaryTreePaths(TreeNode* root) {
   
        vector<string> result;//存放结果
        stack<TreeNode*> treest;//遍历树的结点
        stack<string> pathst;//遍历路径的结点
        if(root==NULL) return result;
        treest.push(root);
        pathst.push(to_string(root->val));
        while(!treest.empty()){
   
            TreeNode* cur=treest.top();
            treest.pop();
            string path=pathst.top();//获取当前结点的已经遍历的路径
            pathst.pop();
            if(cur->left==NULL&&cur->right==NULL) result.push_back(path);
            if(cur->right) {
   
                //前序先右后左
                treest.push(cur->right);
                pathst.push(path+"->"+to_string(cur->right->val));
            }
            if(cur->left) {
   
                //前序先右后左
                treest.push(cur->left);
                pathst.push(path+"->"+to_string(cur->left->val));
            }
        }   
        return result;
    }

113. 路径总和 II


给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 225
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1
返回:

[
   [5,4,11,2],
   [5,8,4,5]
]
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution1 {
   //迭代
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
   
        vector<vector<int>> res;
        stack<TreeNode*> stmp;
        stack<vector<int>> vtmp;//和栈同步跟新,记录当前遍历值
        if(root==NULL) return res; 
            stmp.push(root);
            vector<int> tmp;
            tmp.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值