今天的每日一题:1202. 从根到叶的二进制数之和。

简单来说,就是给定一颗层序遍历的数组,表示一颗树,例如:

输入:root = [1,0,1,0,1,0,1]
输出:22
解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22

可以表示为:

    1
   / \
  0   1
 / \  / \
0  1  0  1

思路就是使用dfs来遍历这个树,代码为:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int dfs(TreeNode *root, int val) {
        if (root == nullptr)
            return 0;

        val = val << 1 | root->val;
        if (root->left == nullptr && root->right == nullptr)
            return val;
        
        return dfs(root->left, val) + dfs(root->right, val);
    }

    int sumRootToLeaf(TreeNode* root) {
        return dfs(root, 0);    
    }
};

拿到这个题就知道用dfs,但是这个计算的方式确实没想到,二进制移位操作,并且使用局部变量保存临时结果,就不需要复杂的字符串拼接然后转换10进制了,例如上例:

1. root->val : 1
    curr val : 1
    goto dfs(root->left, 1)
2. root->left->val : 10
    curr val : 10
    goto dfs(root->left->left, 10)
3. root->left->left->val : 100
    curr val : 100
    return 100
4. goto 2
    goto dfs(root->left->right, 10)
    curr val : 10
5. root->left->right->val : 101
    curr val : 101
    return 101
6. goto 2
    return 100 + 101
    curr val : 10
7. goto 1
    curr val : 1
    goto dfs(root->right, 1)
8. root->right->val : 11
    curr val : 11
    goto dfs(root->right->left, 11)
9. root->right->left->val : 110
    curr val : 110
    return 110
10. goto 8
    curr val : 11
    goto dfs(root->right->right, 11)
11. root->right->right->val : 111
    curr val : 111
    return 111
12. goto 7
    curr val : 1
    return 110 + 111
13 return 100 + 101 + 110 + 111

如此一来就可以得到最后的结果,虽然是一道easy,但还是想了很久,下次碰到类似题目,希望可以记住这样好的思路。