Sum Root to Leaf Numbers

本文介绍了二叉树中所有从根节点到叶子节点的路径数值之和的计算方法。通过两种递归算法实现:一是利用辅助函数计算单条路径的和;二是采用全局变量累计所有路径的和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

    1
   / \
  2   3

Return the sum = 12 + 13 = 25.

思路:递归

首先有好几种思路,本程序写的是从顶端到本结点的一个sum值,非所有的。也可以写一个代表所有的sum总和值得。

代码2很巧妙的,用了一个全局变量sum,函数递归调用很不错。值得参考。

两种方法:

>1、

sumHelper(TreeNode *root,int sum),

首先判断本节点是否为空,为空直接返回0,接着开始计算,注意,这里的sum是指从根节点到此节点的上一个节点的sum之和

再者就是判断两个孩子是否都为空

所以最后的函数递归调用sumHelper(root->left,sum)+sumHelper(root->right,sum);

>2、

深搜。

首先判断是否到左右孩子均没有的情况,sum是一个全局变量,此时,我先搜索到最深节点,注意递归内容:10*num+root->left->val

这就是本条路径的所有行进到此节点的sum和,然后我再判断是否左右节点存在,继续用sum分别加上左杰节点内容,而不会改变值大小。



代码:

/**
 * 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:
    int sumNumbers(TreeNode* root) {
        
        return sumHelper(root,0);
    }
    
    int sumHelper(TreeNode *root,int sum){
        if(root==NULL){
            return 0;
        }
        sum=sum*10+root->val;
        if(root->left==NULL&&root->right==NULL){
            return sum;
        }
        //这个sum应该是代表从顶端到此刻结点的总和。
        return sumHelper(root->left,sum)+sumHelper(root->right,sum);
    }
};


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution2 {
public:
    int sum=0;
    int sumNumbers(TreeNode* root) {
        int result=0;
        if(root==NULL){
            return 0;
        }
        dfs(root,root->val);
        return sum;
    }
    
    int dfs(TreeNode *root,int num){
        if(root->left==NULL&&root->right==NULL){
            sum+=num;//这个时候是总和
        }
        if(root->left!=NULL){
            dfs(root->left,10*num+root->left->val);
        }
        if(root->right!=NULL){
            dfs(root->right,10*num+root->right->val);
        }
        
    }
    
};



转载于:https://www.cnblogs.com/jsrgfjz/p/8526415.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值