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

(2021.03.05 更新)

使用前序遍历访问每个节点时, 使用一个变量 prev 记录到达当前节点的父节点时, 这条二进制路径所表达的数, 那么到达当前节点的路径表达的数可以表示为 cur = 2 * prev + root->val. 在遍历节点的过程中, 更新 cur 值, 直到访问到根节点时, 将 cur 加入到 sum 中.

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

C++ 实现 2

采用 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++ 实现 3

来自 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);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值