LeetCode二叉树从上至下路径问题总结(112.113.437.129)

目录

LeetCode112.路径总和

LeetCode113.路径总和II

LeetCode437.路径总和III(双递归)

LeetCode129.求根到叶子节点数字之和


LeetCode112.路径总和

  • 这类从上到下的二叉树路径问题一般都是递归解决!
  • 这道题的难点在于提前一层判断是不是能构成目标的sum值
  • 如果放在最后一层判断的话,既要判断终止条件又要判断目标条件会比较麻烦!

LeetCode二叉树从上至下路径问题总结(112.113.437.129)_第1张图片

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if(root==NULL)
            return false;
        //提前一层进行判断,如果用sum==0进行判断终止条件不好写
        if(root->val==sum&&!root->left&&!root->right)
            return true;
        return hasPathSum(root->left,sum-root->val)||hasPathSum(root->right,sum-root->val);
    }
};

LeetCode113.路径总和II

  • 还是递归思路,同样注意要在倒数第二层提前进行判断!
  • 和第一题不同的是终止条件不同,如果能够真正理解前面的做法,这一题一定也能解决!

LeetCode二叉树从上至下路径问题总结(112.113.437.129)_第2张图片

class Solution {
private:
    vector> v;
public:
    vector> pathSum(TreeNode* root, int sum) {
        vector a;
        pathSum(root,sum,a);
        return v;
    }
    void pathSum(TreeNode* root,int sum,vector a){
        if(root==NULL)
            return;
        a.push_back(root->val);
        //在倒数第二层进行判断,如果能满足目标条件
        if(sum==root->val&&!root->left&&!root->right){
            v.push_back(a);
            return;
        }
        pathSum(root->left,sum-root->val,a);
        pathSum(root->right,sum-root->val,a);
    }
};

LeetCode437.路径总和III(双递归)

  • 这题基于以上两题的技巧之上
  • 特别注意的起点和终点都是不确定的
  • 终点可以通过递归的终止条件进行判断
  • 起点可以是任意的!所以前序遍历一遍,以每个结点为起点再进行寻找符合条件的路径!
  • 这个技巧称为双递归
  • 其实能想到思路的话确实算比较简单的,如果和我一样一开始没有想到双递归,就如下的心情:
    LeetCode二叉树从上至下路径问题总结(112.113.437.129)_第3张图片

LeetCode二叉树从上至下路径问题总结(112.113.437.129)_第4张图片

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    int num = 0;
public:
    int pathSum(TreeNode* root, int sum) {
        //前序遍历每一个结点
        if(root==NULL)
            return 0;
        //以每个结点为起点再进行寻找递归
        fun(root,sum);
        pathSum(root->left,sum);
        pathSum(root->right,sum);
        return num;
    }
    void fun(TreeNode* root,int sum){
        if(root==NULL)
            return;
        //还是要注意提前一层进行判断
        if(sum==root->val)
            num++;
        if(root->left)
            fun(root->left,sum-root->val);
        if(root->right)
            fun(root->right,sum-root->val);
    }
};

LeetCode129.求根到叶子节点数字之和

  • 当然是递归解决,这很明显,思考一下层序遍历BFS是不好处理的
  • 思考一下递归的时候从上到下,判断终止的条件不难想出来;
  • 注意要提前判断最后一层!这类题目要注意这个判断条件,有的时候是判断倒数第二层!
  • 难点在于怎样求出值!
  • (套路)因为每再进行一次递归的时候sum都乘以10,最后的结果即为答案
  • 如果是按照深度来考虑的,不知道每次递归的高度,因为是要当前的值乘以高度才能得出答案的!

LeetCode二叉树从上至下路径问题总结(112.113.437.129)_第5张图片

LeetCode二叉树从上至下路径问题总结(112.113.437.129)_第6张图片

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int sumNumbers(TreeNode* root) {
        return PreOrderSum(root,0);
    }
    int PreOrderSum(TreeNode* root,int sum){
        if(root==NULL)
            return 0;
        //如果已经是最后一层
        else if(!root->left&&!root->right)
            return 10*sum+root->val;
        //不是最后一层
        return PreOrderSum(root->left,sum*10+root->val)+PreOrderSum(root->right,sum*10+root->val);
    }
};

 

你可能感兴趣的:(LeetCode,算法—树与图论)