(刷题笔记)Leetcode 1022.从根到叶的二进制之和

这篇博客介绍了LeetCode第1022题,要求求解从二叉树根节点到叶子节点的所有路径所表示的二进制数之和,模10^9 + 7。博主分享了对题目的理解、解题思路和递归解决方案,特别强调了如何进行二进制操作和中序遍历。

题目

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

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

以 10^9 + 7 为模,返回这些数字之和。

示例:
在这里插入图片描述
输入:[1,0,1,0,1,0,1]
输出:22
解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-root-to-leaf-binary-numbers

解题思路

没有弄懂题目里面的模是什么意思,不过按示例的意思,结果返回这些二进制数转换成十进制之后的和。
本题与题目257.二叉树的所有路径类似,主要考察树的中序遍历。257额外考察一点string的知识,本题额外考察一点二进制的知识。

正好257介绍的是非递归思路,所以这里介绍递归思路。

  • 1.递归结束条件:root==NULL
  • 2.递归过程中要做的事情:
    • a.记录每个结点的值,并将值按遍历顺序排列成二进制数;
    • b.将满足要求的值加到结果中;
  • 3.递归顺序:先左后右

知识点总结

二进制操作符:左移<< 相当于乘2 右移>> 相当于除2
二进制转十进制的公式:binary=(binary<<1)|root->val;
参考:C++二进制操作符

代码(C++)

递归

/**
 * 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:

    void dfs(TreeNode* root,int binary,int &res){
        if(root==NULL) return ;
        binary=(binary<<1)|root->val;
        if(root->left==NULL&&root->right==NULL){
            res+=binary;
        }

        dfs(root->left,binary,res);
        dfs(root->right,binary,res);
    }



    int sumRootToLeaf(TreeNode* root) {
        int res=0;
        int binary=0;
        dfs(root,binary,res);
        return res;

    }
};

非递归

/**
 * 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) {

        stack<pair<TreeNode*,int>> st;
        int binary=0;
        int res=0;

        while(!st.empty()||root){

            while(root){
                binary=(binary<<1)|root->val;
                st.push(pair(root,binary));
                root=root->left;
            }

            binary=st.top().second;
            root=st.top().first;
            st.pop();
            if(root->left==NULL&&root->right==NULL){
                res+=binary;
            }
            root=root->right;
        }
        return res;
       

    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值