1022. Sum of Root To Leaf Binary Numbers*

1022. Sum of Root To Leaf Binary Numbers*

https://leetcode.com/problems/sum-of-root-to-leaf-binary-numbers/

题目描述

Given a binary tree, each node has value 0 or 1. Each root-to-leaf path represents a binary number starting with the most significant bit. For example, if the path is 0 -> 1 -> 1 -> 0 -> 1, then this could represent 01101 in binary, which is 13.

For all leaves in the tree, consider the numbers represented by the path from the root to that leaf.

Return the sum of these numbers.

Example 1:

Input: [1,0,1,0,1,0,1]
Output: 22
Explanation: (100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22

Note:

  1. The number of nodes in the tree is between 1 and 1000.
  2. node.val is 0 or 1.
  3. The answer will not exceed 2^31 - 1.

C++ 实现 1

采用 DFS + Backtracing 的思路. 注意在 cur.pop_back() 时, 需要判断左右节点是否为空. 另外, 为了将二进制字符串转换为整数, 可以采用 std::stoi 方法: (参考 C++ STL stoi() function)

int stoi (const string&  str, [size_t* idx], [int base]);

中间这个参数设置为 0 即可. 只有当当前节点为叶子节点时, 才需要将当前节点的值加入到 sum 中.

class Solution {
private:
    void dfs(TreeNode *root, string &cur, int &sum) {
        if (!root) return;
        cur += std::to_string(root->val);
        if (!root->left && !root->right) {
            sum += std::stoi(cur, 0, 2);
            return;
        }
        dfs(root->left, cur, sum);
        if (root->left) cur.pop_back();
        dfs(root->right, cur, sum);
        if (root->right) cur.pop_back();
    }
public:
    int sumRootToLeaf(TreeNode* root) {
        int sum = 0;
        string cur;
        dfs(root, cur, sum);
        return sum;
    }
};

C++ 实现 2

来自 LeetCode Submission, 代码比我的简洁. 只有当当前节点为叶子节点时, 才需要将当前节点的值加入到 summation 中.

/**
 * 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 sumRootToLeaf(TreeNode* root) {
        int cnt = 0;
        dfs(root, cnt);
        return summation;
    }

private:
    int summation = 0;
    void dfs(TreeNode* root, int cnt)
    {
        if(!root)
            return;
        cnt = 2*cnt+root->val;
        if(!root->left && !root->right)
            summation += cnt;
        dfs(root->left, cnt);
        dfs(root->right, cnt);
    }
};
发布了327 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Eric_1993/article/details/104468961