二叉树的所有路径和——中等难度

Posted 我是一颗大萝北

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的所有路径和——中等难度相关的知识,希望对你有一定的参考价值。

一、题目描述

在这里插入图片描述

二、问题分析

要找从根节点到叶子结点的路径,必须得是先序遍历
(1)首先想到用一个全局变量sum去记录每一条路径的累加和
(2)叶子结点肯定是递归的一个出口
(3)别忘了root==nullpt也是递归的出口,并且要放在函数的第一行

三、初版代码

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int sum=0;
    int sumNumbers(TreeNode* root) {
        // write code here
        if(root==nullptr) return 0;  //空树,直接返回0
        temp(root,0);
        return sum;
            
    }
    void temp(TreeNode* root, int num){
        if(root->right==nullptr&&root->left==nullptr)  //叶子结点
        {
            sum=sum+(num*10+root->val);
            return;
        }
        if(root==nullptr)  //空节点
            return;
        /*---如果既不是叶子结点,也不是空节点,进行先序遍历----*/
        num=num*10+root->val;  //根
        temp(root->left, num);  //左
        temp(root->right,num);  //右
    }
};

报错:
在这里插入图片描述

原因居然是这样的。。。
对结点是否为空的判断一定要放在最前面!也就是这个if语句一定要放在递归函数的最前面。否则会出现nullptr->right和nullptr->left这种溢出错误。

 if(root==nullptr)  //空节点
            return;

或者,直接这样

      if(root->right==nullptr&&root->left==nullptr)  //叶子结点 或 只有一个根节点的树
        {
            sum=sum+(num*10+root->val);
            return;
        }
        //if(root==nullptr)  //空节点
        //    return;
        /*---如果既不是叶子结点,也不是空节点----*/
        num=num*10+root->val;
        if(root->left!=nullptr) temp(root->left, num);
        if(root->right!=nullptr) temp(root->right,num);

四、给出最终代码

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int sum=0;
    int sumNumbers(TreeNode* root) {
        // write code here
        if(root==nullptr) return 0;  //空树,直接返回0
        temp(root,0);
        return sum;
            
    }
    void temp(TreeNode* root, int num){
        if(root==nullptr)  //空节点
            return;
        if(root->right==nullptr&&root->left==nullptr)  //叶子结点
        {
            sum=sum+(num*10+root->val);
            return;
        } 
        /*---如果既不是叶子结点,也不是空节点----*/
        num=num*10+root->val;
        temp(root->left, num);
        temp(root->right,num);
    }
};

或者

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int sum=0;
    int sumNumbers(TreeNode* root) {
        // write code here
        if(root==nullptr) return 0;  //空树,直接返回0
        temp(root,0);
        return sum;
            
    }
    void temp(TreeNode* root, int num){
        if(root->right==nullptr&&root->left==nullptr)  //叶子结点
        {
            sum=sum+(num*10+root->val);
            return;
        }
        //if(root==nullptr)  //空节点
        //    return;
        /*---如果既不是叶子结点,也不是空节点----*/
        num=num*10+root->val;
        if(root->left!=nullptr) temp(root->left, num);
        if(root->right!=nullptr) temp(root->right,num);
    }
};

在这里插入图片描述

以上是关于二叉树的所有路径和——中等难度的主要内容,如果未能解决你的问题,请参考以下文章

实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)

c_cpp 236.二叉树的最低共同祖先 - 难度中等 - 2018.9.13

一天一大 lee完全二叉树的节点个数 (难度:中等) - Day20201124

力扣543:二叉树的直径C++

输出二叉树的右视图(NC136/考察次数Top40/难度中等)

236. 二叉树的最近公共祖先-中序遍历-中等难度