[labuladong算法小抄]手把手带你刷二叉树(第一期)唯一客服系统开发笔记

本文摘自labuladong算法小抄,使用go语言描述

我们公众号的成名之作学习数据结构和算法的框架思维中多次强调,先刷二叉树的题目,先刷二叉树的题目,先刷二叉树的题目,因为很多经典算法,以及我们前文讲过的所有回溯、动归、分治算法,其实都是树的问题,而树的问题就永远逃不开树的递归遍历框架这几行破代码:

我先花一些篇幅说明二叉树算法的重要性。

举个例子,比如说我们的经典算法「快速排序」和「归并排序」,对于这两个算法,你有什么理解?如果你告诉我,快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历,那么我就知道你是个算法高手了。

为什么快速排序和归并排序能和二叉树扯上关系?我们来简单分析一下他们的算法思想和代码框架:

快速排序的逻辑是,若要对nums[lo..hi]进行排序,我们先找一个分界点p,通过交换元素使得nums[lo..p-1]都小于等于nums[p],且nums[p+1..hi]都大于nums[p],然后递归地去nums[lo..p-1]和nums[p+1..hi]中寻找新的分界点,最后整个数组就被排序了。

快速排序的代码框架如下:

funcsort(nums*[]int,loint,hiint){/******前序遍历位置******///通过交换元素构建分界点pp:=partition(nums,lo,hi)/************************/sort(nums,lo,p-1)sort(nums,p+1,hi)}先构造分界点,然后去左右子数组构造分界点,你看这不就是一个二叉树的前序遍历吗?

再说说归并排序的逻辑,若要对nums[lo..hi]进行排序,我们先对nums[lo..mid]排序,再对nums[mid+1..hi]排序,最后把这两个有序的子数组合并,整个数组就排好序了。

归并排序的代码框架如下:

funcsort(numsint[],loint,hiint){mid:=(lo+hi)/2sort(nums,lo,mid);sort(nums,mid+1,hi)/******后序遍历位置******///合并两个排好序的子数组merge(nums,lo,mid,hi)/************************/}先对左右子数组排序,然后合并(类似合并有序链表的逻辑),你看这是不是二叉树的后序遍历框架?另外,这不就是传说中的分治算法嘛,不过如此呀。

如果你一眼就识破这些排序算法的底细,还需要背这些算法代码吗?这不是手到擒来,从框架慢慢扩展就能写出算法了。

说了这么多,旨在说明,二叉树的算法思想的运用广泛,甚至可以说,只要涉及递归,都可以抽象成二叉树的问题,所以本文和后续的手把手带你刷二叉树(第二期)以及手把手刷二叉树(第三期),我们直接上几道比较有意思,且能体现出递归算法精妙的二叉树题目,东哥手把手教你怎么用算法框架搞定它们

我们前文二叉树的最近公共祖先写过,写递归算法的关键是要明确函数的「定义」是什么,然后相信这个定义,利用这个定义推导最终结果,绝不要跳入递归的细节。

怎么理解呢,我们用一个具体的例子来说,比如说让你计算一棵二叉树共有几个节点:

//定义:count(root)返回以root为根的树有多少节点funccount(root*TreeNode)int{//basecaseifroot==nil{return0}//自己加上子树的节点数就是整棵树的节点数return1+count(root.left)+count(root.right)}这个问题非常简单,大家应该都会写这段代码,root本身就是一个节点,加上左右子树的节点数就是以root为根的树的节点总数。

左右子树的节点数怎么算?其实就是计算根为root.left和root.right两棵树的节点数呗,按照定义,递归调用count函数即可算出来。

我们接下来看几道算法题目实操一下。

第一题、翻转二叉树

我们先从简单的题开始,看看力扣第226题「翻转二叉树」,输入一个二叉树根节点root,让你把整棵树镜像翻转,比如输入的二叉树如下:

4/\27/\/\1369算法原地翻转二叉树,使得以root为根的树变成:

4/\72/\/\9631通过观察,我们发现只要把二叉树上的每一个节点的左右子节点进行交换,最后的结果就是完全翻转之后的二叉树。

可以直接写出解法代码:

//将整棵树的节点翻转funcinvertTree(root*TreeNode)*TreeNode{//basecaseifroot==nil{returnnil}/****前序遍历位置****///root节点需要交换它的左右子节点tmp:=root.leftroot.left=root.rightroot.right=tmp//让左右子节点继续翻转它们的子节点invertTree(root.left)invertTree(root.right)returnroot}这道题目比较简单,关键思路在于我们发现翻转整棵树就是交换每个节点的左右子节点,于是我们把交换左右子节点的代码放在了前序遍历的位置。

值得一提的是,如果把交换左右子节点的代码放在后序遍历的位置也是可以的,但是放在中序遍历的位置是不行的,请你想一想为什么?这个应该不难想到,我会把答案置顶在公众号留言区。

首先讲这道题目是想告诉你,二叉树题目的一个难点就是,如何把题目的要求细化成每个节点需要做的事情。

这种洞察力需要多刷题训练,我们看下一道题。

第二题、填充二叉树节点的右侧指针

这是力扣第116题,看下题目:

而且题目说了,输入是一棵「完美二叉树」,形象地说整棵二叉树是一个正三角形,除了最右侧的节点next指针会指向null,其他节点的右侧一定有相邻的节点。

这道题怎么做呢?把每一层的节点穿起来,是不是只要把每个节点的左右子节点都穿起来就行了?

我们可以模仿上一道题,写出如下代码:

funcconnect(root*Node)*Node{ifroot==nil||root.left==nil{returnroot}root.left.next=root.rightconnect(root.left)connect(root.right)returnroot}这样其实有很大问题,再看看这张图:

节点5和节点6不属于同一个父节点,那么按照这段代码的逻辑,它俩就没办法被穿起来,这是不符合题意的。

回想刚才说的,二叉树的问题难点在于,如何把题目的要求细化成每个节点需要做的事情,但是如果只依赖一个节点的话,肯定是没办法连接「跨父节点」的两个相邻节点的。

那么,我们的做法就是增加函数参数,一个节点做不到,我们就给他安排两个节点,「将每一层二叉树节点连接起来」可以细化成「将每两个相邻节点都连接起来」:

//主函数funcconnect2(root*Node)*Node{ifroot==nil{returnnil}connectTwoNode(root.left,root.right)returnroot}//辅助函数funcconnectTwoNode(node1*Node,node2*Node){ifnode1==nil||node2==nil{return}/****前序遍历位置****///将传入的两个节点连接node1.next=node2//连接相同父节点的两个子节点connectTwoNode(node1.left,node1.right)connectTwoNode(node2.left,node2.right)//连接跨越父节点的两个子节点connectTwoNode(node1.right,node2.left)}这样,connectTwoNode函数不断递归,可以无死角覆盖整棵二叉树,将所有相邻节点都连接起来,也就避免了我们之前出现的问题,这道题就解决了。

THE END
1.CSUOJ2 8208231515 烫团团(Lwt) 6 01:56:59 00:04:17 00:06:14 00:09:53 00:12:37 00:18:06 00:25:52(-2) 3 8211210317 8211210317 6 02:56:46 00:07:07 00:10:11 00:17:25 00:21:18 00:40:11(-1) 01:00:34 4 csu8102220905 T2201hby 6 02:56:56 00:06:38(-2) 00:08:05 00http://vlab.csu.edu.cn/oj/contestrank.php?cid=1282&user_id=8208231716
2.labuladong的算法笔记学习计划零钱兑换 中等 二叉树的最小深度 简单 打开转盘锁 中等 二叉树的最大深度 简单 二叉树的直径 简单 在排序数组中查找元素的第一个和最后一个位置 中等 最小覆盖子串 困难 字符串的排列 中等 找到字符串中所有字母异位词 中等 无重复字符的最长子串 中等 https://leetcode.cn/studyplan/labuladong-algorithm-note/
3.GitHublabuladong/fuckinglabuladong 的算法笔记 本仓库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌,后面有目录。 我先吐槽几句。刷题刷题,刷的是题,培养的是思维,本仓库的目的就是传递这种算法思维。我要是只写一个包含 LeetCode 题目代码的仓库,https://github.com/labuladong/fucking-algorithm
4.labuladong原创 《labuladong的算法笔记》出繁体版了~ 鉴于《labuladong 的算法笔记》纸质书名气很大,现已经翻译成了繁体中文:上周收到了出版社寄来的实体书,整体上来看,厚度和原版差不多:不过有一点小小的遗憾,原版是双色印刷,而繁体版的内容是黑白印刷的:我原以为繁体中文和简体中文只是字体不同,连蒙带猜应该不难https://me.csdn.net/blink/fdl123456
5.第51期:《labuladong的算法笔记》《labuladong算法笔记》源自作者在Github上的高赞硬核教程~~ 该教程本身就名声在外,受到众多小伙伴追捧,如今已收获120K star! 而《labuladong算法笔记》是将原高赞教程经过重新排版、整理、精炼之后的升级版。 《labuladong算法笔记》中的所有图都是全部重新设计过的,做笔记、划重点都很方便,阅读体验更好。 https://spring4all.com/5261.html
6.Labuladong的算法笔记算法笔记 作者:胡凡 ISBN:9787111540090 出版社:机械工业出版社 出版年:2016 算法笔记 作者:刁瑞 ISBN:9787121446306 出版社:电子工业出版社 出版年:2023 算法笔记 作者:刁瑞 ISBN:9787121286711 出版社:电子工业出版社 出版年:2016 爱情笔记 作者:(英)阿兰·德波顿著 ISBN:9787532785032 出版社:上海译文出版社 https://www.las.ac.cn/front/book/detail?id=c0198eb0d30bba4c7cb75e4278329d44
7.算法笔记《labuladong的算法小抄》第1章:核心套路篇之回溯【算法笔记】《labuladong 的算法小抄》第 1 章:核心套路篇之回溯算法与 BFS 算法 歧泽风关注IP属地: 北京 2021.04.28 14:45:20字数503阅读922 1.3. 回溯算法 回溯问题:决策树 的遍历过程,纯暴力枚举 路径:已做出 的选择 选择列表:当前能做 的选择 结束条件:无法再做 选择的条件 result = [] def backhttps://www.jianshu.com/p/c34551776588
8.labuladong算法笔记总结51CTO博客labuladong算法笔记总结 动态规划解题套路框架 学习计划: 最长回文子序列 〇、必读文章 1、数据结构和算法学习指南(学习算法和刷题的框架思维) 了解数据结构的操作和遍历(迭代or递归) 从树刷起,结合框架思维,有利于理解(回溯、动态规划、分治等)https://blog.51cto.com/liujinhui/5356859
9.labuladong的算法小抄.rar码农集市专业分享IT编程学习资源甜甜**一口上传80.89MB文件格式rarlabuladong 的算法小抄,旨在帮助读者整理 算法套路,助试,禁?商?! (0)踩踩(0) 所需:1积分 基于蓝牙4.0的防丢器源码 2024-12-18 22:56:12 积分:1 Matlab实现熵权法 2024-12-18 22:48:19 积分:1 https://www.coder100.com/index/index/content/id/3867384
10.labuladong的算法秘籍V2.0(力扣版).pdflabuladong的算法秘籍V2.0(力扣版).pdf,在线?站 labuladong的刷题三件套 ?录 开篇、算法秘籍阅读指南 ?剑篇、刷题?法 学习算法和刷题的框架思维 计算机算法的本质 学剑篇、基础数据结构 1.1 数组/链表 美的算法技巧:前缀和数组 美的算法技巧:https://m.book118.com/html/2022/0902/7133114054004161.shtm
11.图结构基础及通用代码实现labuladong的算法笔记最短路径算法、 最小生成树算法等,这些都会在后文介绍。 本文主要介绍图的基本概念,以及如何用代码实现图结构。 本文为会员内容,购买2024 新版网站会员即可解锁。 如果你之前在小鹅通平台上购买过课程,需要你按照这里的步骤将小鹅通课程权限迁移到本站。https://labuladong.github.io/algo/data-structure/graph-traverse/
12.labuladong的算法小抄(豆瓣)写笔记 写书评 加入购书单 分享到 推荐 内容简介· ··· 《labuladong的算法小抄》专攻算法刷题,训练算法思维,应对算法笔试。注重用套路和框架思维解决问题,以不变应万变。 第1章列举了几个最常见的算法类型及对应的解题框架思路,包括动态规划、回溯、广度优先搜索及双指针、滑动窗口等算法技巧。 第2章用动态https://book.douban.com/isbn/978-7-121-39933-6/
13.labuladong的算法小抄完整版PDF电子书下载labuladong算法小抄下载 投诉报错 书籍大小:103MB 书籍语言:简体中文 书籍类型:国产软件 书籍授权:免费软件 书籍类别:编程其它 应用平台:PDF 更新时间:2020-12-14 购买链接:京东异步社区 网友评分: 360通过腾讯通过金山通过 103MB 详情介绍 ?先,这?讲的都是普通的数据结构,咱不是搞算法竞赛的,野路?出?https://www.jb51.net/books/756536.html
14.转发微博转发@网路冷眼:#冷眼赠书福利来自网路冷眼转发微博【转发】@网路冷眼:#冷眼赠书福利# 联合 @博文视点Broadview 送出 5 本《labuladong的算法笔记》,截止 9 月 23 日,转发此微博并关注 @网路冷眼 赢取。GitHub高赞硬核算法教程,挑战大厂Offer,力扣正https://weibo.com/1715118170/NkzkNdxgW
15.知了帮labuladong的算法笔记 付东来(@labuladong) 漫画chatGPT 魏梦舒(@程序员小灰) 漫画Python数据分析 张文霖 AI超级个体 易洋(@findyi) 潘泽彬 李世明 记忆之道 申一帆 我看见了风暴 谭婧 趣话计算机底层技术 轩辕之风(@編程技术宇宙) 漫画SQL数据分析 张文霖 http://read.zhiliaobang.com/
16.字节算法大神手写的算法笔记,曾连续多次霸榜GitHubTrending为了让大家更好地学习算法,楼主在这里分享一份字节跳动大神手写的算法笔记 《labuladong的算法小抄官方完整版》PDF 此前在 GitHub 出现了一个手把手带你刷 LeetCode 的项目:fucking-algorithm。 该项目在 GitHub 开源后,连续多次霸榜 GitHub Trending 首页,用了两个月 Star 数便破 50k,这份受欢迎程度由此可见一斑https://maimai.cn/article/detail?fid=1736402150&efid=X8eKhkwZMO3PjRt-BGiI-w
17.书单看完这几本书,不信拿不到好Offer!然后详细分析程序的时间复杂度和空间复杂度,包括如何把控程序的实际运行时间,以及编程语言的内存管理。接着讲解数组、链表、哈希表、字符串、栈与队列、二叉树、回溯算法、贪心算法、动态规划的理论基础及其相关题目。 (京东满100减50,快快扫码抢购吧!) 05 《labuladong的算法小抄》http://www.broadview.com.cn/article/420150
18.火了!北大学霸爆肝3个月的算法小抄完整笔记,GitHub疯狂转发不问不知道,这份刷题笔记来自FB高级架构师、ACM金牌选手。 这位学霸在刷题和打ACM比赛中总结出了经验和套路,又疯狂爆肝3个月,对面试中的常考算法知识点给出通用解题思路和代码模板,已经有不少人通过这份小抄逆风翻盘。 刷题3遍,不如“算法小抄”过一遍 https://cloud.tencent.com/developer/article/2143584
19.《漫画算法:小灰的算法之旅(Python篇)(全彩)》(魏梦舒)简介脑信息数据分析方法研究漫画算法:小灰的算法之旅基于ACT-R与fMRI融合的情绪与认知计算的信息加工过程研究 属性 漫画算法(Python篇)漫画算法labuladong的算法笔记 电子工业出版社当当自营 进入店铺收藏店铺 商品详情 开本:16开 纸张:胶版纸 包装:平装-胶订 http://product.dangdang.com/28529383.html
20.23届秋招NLP和搜广推算法面经+字节核心业务算法岗内推这时候可以刷一下这个爆料网站的题目缓解一下,安慰自己手撕代码准备到万无一失了,也可以保持下手感(虽然我每次面试遇到的都不是爆料的,可能投的太早了,好些题目是我爆料上去的,[裂开])       Labuladong和LeetCode 101是我秋招看的比较多的算法刷题总结,面友们https://m.nowcoder.com/feed/main/detail/19f58297b43743cb8f218a99864f61a2
21.Whyno?Justdoit!i.want.to.believe(748tabs)labuladong/fucking-algorithm: 刷算法全靠套路,认准 labuladong 就够了!English version supported! Crack LeetCode, not only how, but also why. labuladong/fucking-algorithm: 刷算法全靠套路,认准 labuladong 就够了!English version supported! Crack LeetCode, not only how, but also why. the-arthttps://www.gettoby.com/p/0qhnlxhp4lfh