从根到叶的二进制树之和

原题:

给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。

对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。

返回这些数字之和。题目数据保证答案是一个 32 位 整数。

示例 1: 1022. 从根到叶的二进制树之和 - 图1

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

示例 2:

输入:root = [0]
输出:0

示例 3:

输入:root = [1]
输出:1

示例 4:

输入:root = [1,1]
输出:3

提示:

  • 树中的结点数介于 1 和 1000 之间。
  • Node.val 为 0 或 1 。

解题方法:

解法一:

class Solution {
public:
    int res=0;
    int sumRootToLeaf(TreeNode* root) {
        if(!root) return 0;
        int sum=0;
        Sum(root,sum);
        return res;
    }

    void Sum(TreeNode* root,int sum)
    {
        if(!root) return;
        sum=sum<<1;
        sum+=root->val;     //先左移一位,再加上当前节点的值,就正好为根到当前节点的
        if(root->left==nullptr&&root->right==nullptr)
        {
            res+=sum;
        }
        Sum(root->left,sum);
        Sum(root->right,sum);

        return;
    }
};

做题小结:

针对解法一:

  1. 本题需要考虑到回溯,因此我会另外用一个函数,传递两个参数,其中sum就具有回溯作用。
  2. 二进制数的运算需要用到<<和>>运算符

做题不能太浮躁,其实这种简单题静下心来很容易就想出来了