【刷题】 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♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499184.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

96 “+“ 和 方法调用 的优先级问题导致的字符串拼接问题

前言 呵呵 最近的时候碰到了这样的一个问题 我使用 来进行字符串拼接, 拼接了之后 我想替换掉 整个字符串里面的 "Auth" 字符串 结果出现了这样的一个问题, 呵呵 刚看到这个问题的时候, 有点懵 但是 其实是一个 算是比较简单的一个问题吧 以下截图, 调试 基…

大模型量化技术原理-SmoothQuant

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;从而导致模型变得越来越大&#xff0c;因此&#xff0c;我们需要一些大模型压缩技术来降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型压缩主要分…

Linux:Makefile的相关知识

背景&#xff1a; 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至于进行更复…

【C#】忽略大小的替换字符串

结果 代码 string a"aAAAAAAaBBaaCC"; string b Strings.Replace(a, "a", "D", 1, -1, CompareMethod.Text);

力扣:35. 搜索插入位置

力扣&#xff1a;35. 搜索插入位置 描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,…

手把手教你如何使用ESP8266(ESP-01S)连接到阿里云物联网平台,并通过微信小程序控制设备(如灯的亮、灭、数据上报到微信中显示)

前言 最近在做智能家居的项目&#xff0c;主要是通过esp8266接入云端实现远程控制的效果&#xff0c;于是就想到用微信小程序进行控制。由于阿里云物联网平台为设备提供安全可靠的连接通信能力&#xff0c;向下连接海量设备&#xff0c;支撑设备数据采集上云&#xff1b;向上提…

答应我,在vue中不要滥用watch好吗?

前言 上周五晚上8点&#xff0c;开开心心的等着产品验收完毕后就可以顺利上线。结果产品突然找到我说要加需求&#xff0c;并且维护这一块业务的同事已经下班走了&#xff0c;所以只有我来做。虽然内心一万头草泥马在狂奔&#xff0c;但是嘴里还是一口答应没问题。由于这一块业…

web前端-html表单元素

文章目录 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>周鑫的</title></head> <body> <form action"06、内联框架.html" method"get"><h1>登录…

江科大stm32学习笔记——【4-1】OLED

一.原理 1.调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息。 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上。 Keil调试模式&#xff1a;借助Keil软件的调…

Vite 构建的 Vue3 项目如何整合 Monaco Editor 代码编辑器

目录 &#x1f981; 一. 前言&#x1f981; 二. 探索过程2.1 安装2.2 配置 Monaco Editor2.3 编写 Monaco Editor 代码编辑器2.3.1 创建 Coding Editor 组件2.3.2 父组件使用 CodingEditor 组件 2.4 效果展示 三. 总结 &#x1f981; 一. 前言 各位好&#xff01;我是&#x1…

Unity绘制六边形体

现在steam上面有很多下棋类/经营类的游戏都是用六边形的地形&#xff0c;比较美观而且实用&#xff0c;去年在版本末期我也自己尝试做了一个绘制六边体的demo&#xff0c;一年没接触unity竟然都要忘光了&#xff0c;赶紧在这边记录一下。 想cv代码可以直接拉到代码章节 功能 …

面试官:谈一谈Cookie和Session的区别?

我先解释一下Cookie&#xff0c;它是客户端浏览器用来保存服务端数据的一种机制&#xff0c;当我们通过浏览器去进行网页访问的时候&#xff0c;服务器可以把一些状态数据以key-value的形式写入到Cookie里面&#xff0c;存储到客户端浏览器。下一次这个浏览器再访问服务器的时候…