【刷题】 Leetcode 1022.从根到叶的二进制数之和

2024-02-29 23:20

本文主要是介绍【刷题】 Leetcode 1022.从根到叶的二进制数之和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

刷题

  • 1022.从根到叶的二进制数之和
    • 题目描述:
    • 思路一(dfs深搜万能版)
    • 思路二 (栈迭代巧解版)
    • 总结
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

1022.从根到叶的二进制数之和

题目描述:

在这里插入图片描述
题目给出一棵二叉树,我们需要统计计算每条路径的二进制之和。给出的测试用例是
1,0,1,0,1,0,1
则运算为:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22。
难点就在于如何进行每个节点的储存计算,一般来说二叉树都会使用遍历或栈来进行运算。那就让我们来看看这个题如何完美解答吧!!!

思路一(dfs深搜万能版)

一般我们遇到二叉树都会想到遍历,但是这道题我们需要做到是如何记录该节点之前的数据,只有这样才能来进行每条路径的计算。所以首先我们需要单独写入一个函数来满足我们的需求
dfs(struct TreeNode* root ,int val)
其中root负责遍历,val来储存之前的数据,这样就可以进行操作了:
首先我们需要确定递归的返回条件,明确条思路才能顺畅解题!

  1. 如果二叉树为空 返回零
  2. 如果该节点为叶子节点 返回节点值与前面数据值 val 的和
  3. 如果不是叶子节点 返回左右二叉树的和 与 前面数据值 val 的和

确定了返回条件就简单了,把条件写好,剩下的交给计算机计算就OK了!!!

int dfs(struct TreeNode* root,int val){//如果二叉树为空 返回零if(root == NULL) return 0;//如果该节点为叶子节点 返回节点值与前面数据值 val 的和else if(!root->left&&!root->right) return (val << 1) | root->val;//相当于(val*2)+ root->val//如果不是叶子节点 返回左右二叉树的和与前面数据值 val 的和else{val = (val<<1) | root->val;//相当于(val*2)+ root->valreturn dfs(root->left,val) + dfs(root->right ,val);}
}
int sumRootToLeaf(struct TreeNode* root){return dfs(root,0);
}

这里之所以使用位操作而不是使用乘法操作,是因为使用位操作效率更高!乘法的底层是位运算乘法器,所以直接使用就避免了多余的操作。
来看运行结果:
在这里插入图片描述
直接秒天秒地秒世界!!!过啦!!!

思路二 (栈迭代巧解版)

该算法是使用栈来模拟函数递归的过程:

typedef struct TreeNode Node;int sumRootToLeaf(struct TreeNode* root){Node** stack = (Node*)malloc(sizeof(Node)*1001);Node* prev = NULL;int ret = 0;int val = 0,top = 0;while(root != NULL || top){while(root != NULL){stack[top++] = root;val = (val << 1)| root->val;root = root->left;}root = stack[top - 1];if(root->right == NULL || root->right == prev){if(root->right == NULL && root->left == NULL){ret += val;}val >>= 1;top--;prev = root;root = NULL;}else{root = root->right;}}free(stack);return ret;
}

选择遍历二叉树的办法是:

  1. 先创建一个指针 prev 用于储存上一个读取的节点
  2. 先在栈里储存二叉树左边的一条路径(一直 root = root->left)压栈
  3. 然后取出栈顶节点(root = stack[top-1])

接下来是非常关键的一步:
4. 如果该节点的右节点为空 或者 右节点已经遍历过了 就跳过 更替指针(prev = root;root = NULL)否则就进入root 右半树(root = root->right)
5. 循环执行2 - 4 就可以实现效果

只看代码还是十分难理解的,我使用图来简单解释一下:
在这里插入图片描述
就这样,一步一步进行就可以遍历整个树,是不是十分巧妙。结果自然是过啦!!!!
这种方法比较复杂,是非递归遍历二叉树的常用方法。

总结

通过这道题,我学会了递归的深度搜索方法,快速解决问题
也初步认识到了非递归遍历二叉树的方法。但还是不太理解,不知道是如何推出来的。

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

这篇关于【刷题】 Leetcode 1022.从根到叶的二进制数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760434

相关文章

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划