LeetCode 题解 | 129. 求根到叶子节点数字之和(void+全局型DFS C++)

题目描述(中等难度)

原题链接
在这里插入图片描述

算法

(DFS 回溯) O ( n ) O(n)
类似题目:LeetCode 113. 路径总和II(深搜DFS)

  • 用DFS搜索左子树和右子树(自顶向下),每当到达叶子结点时,将tmp加到ans中
  • 注意:dfs(ptr)表示已经更新了从根结点到当前结点(不包括当前结点)的表示成的数tmp

时间复杂度是 O ( n ) O(n) :每个点最多被遍历一次

C++代码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:
    // 类似113.路径之和II
    int totalsum = 0;
    int tmp = 0;

    void dfs(TreeNode* root) {
        if (!root) return;
        
        if (root->left == NULL && root->right == NULL) {
            tmp = tmp * 10 + root->val;
            totalsum += tmp;
            tmp = (tmp - root->val) / 10;
            return;
        }

        tmp = tmp * 10 + root->val;
        dfs(root->left);
        // tmp = (tmp - root->val) / 10;
        // tmp = tmp * 10 + root->val;
        dfs(root->right);
        tmp = (tmp - root->val) / 10; // 恢复现场
        return;
    }

    int sumNumbers(TreeNode* root) {
        if (!root) return 0;
        dfs(root);
        return totalsum;
    }
};

C++代码2

从根节点递归遍历整棵树,遍历时维护从根节点到该节点(不包括该结点)的路径表示的数 s,当遍历到叶节点时,将路径表示的数累加到答案中

class Solution {
public:
    int ans = 0;

    int sumNumbers(TreeNode* root) {
        dfs(root, 0);
        return ans;
    }
    void dfs(TreeNode* u, int s)
    {
        if (!u) return ;
        s = s * 10 + u->val;
        if (u->left) dfs(u->left, s);
        if (u->right) dfs(u->right, s);
        if (!u->left && !u->right) ans += s;
    }
};


写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

发布了249 篇原创文章 · 获赞 89 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104398021