二叉树题型的总结-代码随想录

文章目录二叉树的理论基础二叉树的遍历方式深度优先遍历广度优先遍历求二叉树的属性二叉树:是否对称二叉树:求最大深度二叉树:求最小深度二叉树:求有多少个节点二叉树:是否平衡二叉树:找所有路径二叉树:递归中如何隐藏着回溯二叉树:求左叶子之和二叉树:求左下角的值二叉树:求路径总和二叉树的修改与构造翻转二叉树构造二叉树构造最大的二叉树合并两个二叉树求二叉搜索树的属性二叉搜索树中的搜索是不是二叉搜索树求二叉搜索树的最小绝对差求二叉搜索树的众数二叉搜索树转成累加树二叉树公共祖先问题二叉树的公共祖先问题二叉搜索树的公共祖先
摘要由CSDN通过智能技术生成

原文:二叉树:构造二叉树登场!

文章目录

二叉树的理论基础

关于二叉树,你该了解这些!:二叉树的种类、存储方式、遍历方式、定义方式

二叉树的遍历方式

深度优先遍历

二叉树:前中后序递归法:递归三部曲初次亮相
二叉树:前中后序迭代法(一):通过栈模拟递归
二叉树:前中后序迭代法(二)统一风格

广度优先遍历

二叉树的层序遍历:通过队列模拟

求二叉树的属性

二叉树:是否对称

递归:后序,比较的是根节点的左子树与右子树是不是相互翻转
迭代:使用队列/栈将两个节点顺序放入容器中进行比较

二叉树:求最大深度

递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度
迭代:层序遍历

二叉树:求最小深度

递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义
迭代:层序遍历

二叉树:求有多少个节点

递归:后序,通过递归函数的返回值计算节点数量
迭代:层序遍历

二叉树:是否平衡

递归:后序,注意后序求高度和前序求深度,递归过程判断高度差
迭代:效率很低,不推荐

二叉树:找所有路径

递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径
迭代:一个栈模拟递归,一个栈来存放对应的遍历路径

二叉树:递归中如何隐藏着回溯

详解二叉树:找所有路径中递归如何隐藏着回溯

二叉树:求左叶子之和

递归:后序,必须三层约束条件,才能判断是否是左叶子。
迭代:直接模拟后序遍历

二叉树:求左下角的值

递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点。
迭代:层序遍历找最后一行最左边

二叉树:求路径总和

递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树。
迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和

二叉树的修改与构造

翻转二叉树

递归:前序,交换左右孩子
迭代:直接模拟前序遍历

构造二叉树

106. 从中序与后序遍历序列构造二叉树
递归:前序,重点在于找分割点,分左右区间构造
找到根节点,将中序遍历的数组划分成左右两半,计算这左右两半的长度,将后序遍历的数组划分成两半,最后递归求左右孩子。不要真的切分数组,使用左右边界下标标记范围。
迭代:比较复杂,意义不大

构造最大的二叉树

递归:前序,分割点为数组最大值,分左右区间构造
迭代:比较复杂,意义不大

合并两个二叉树

递归:前序,同时操作两个树的节点,注意合并的规则
迭代:使用队列,类似层序遍历

求二叉搜索树的属性

二叉搜索树中的搜索

递归:二叉搜索树的递归是有方向的
迭代:因为有方向,所以迭代法很简单

是不是二叉搜索树

递归:中序,相当于变成了判断一个序列是不是递增的
迭代:模拟中序,逻辑相同

求二叉搜索树的最小绝对差

递归:中序,双指针操作。中序遍历得到一个递增list,遍历这个list,得到最小绝对差
迭代:模拟中序,逻辑相同

求二叉搜索树的众数

501. 二叉搜索树中的众数
中序遍历遍历搜索二叉树,记录出现次数最多的结点。
new几个全局变量(很关键),max统计整棵树出现次数最多结点的个数,tmp统计当前结点出现的个数,pre表示当前结点的前一个结点,集合list存储出现次数最多的结点。
递归:中序,清空结果集的技巧,遍历一遍便可求众数集合
迭代:模拟中序,逻辑相同

二叉搜索树转成累加树

538. 把二叉搜索树转换为累加树
递归:中序遍历,先便利右孩子,再遍历左孩子,这样遍历得到的结果是递减,是原来中序遍历的逆序,倒置。
迭代:模拟中序,逻辑相同

二叉树公共祖先问题

二叉树的公共祖先问题

236. 二叉树的最近公共祖先
递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。
若当前节点是p/q,要么是找到其中一个结点。要么这个结点就是最近公共祖先,不管是哪种情况,向上返回都没错。
若当前结点不是p/q,那就看左右孩子递归遍历的结果。分为三种情况:1.左右子树递归结果都不是空,说明p,q分别在当前结点的左右子树上,因此当前节点是最近公共祖先。2.只有一个不是空,要么已经找到了最近公共祖先在向上传递,要么当前节点的左右子树只有一个p/q。3.全部为空,说明当前结点的子树上不存在p,q。
迭代:不适合模拟回溯

二叉搜索树的公共祖先问题

235. 二叉搜索树的最近公共祖先
递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先
利用搜索二叉树的特性:左边比中间小,右边比中间大。若root大于p,q,说明两个结点都在左子树上,因此最近公共祖父也在左子树上。若root小于p,q,说明两个结点都在右子树上,因此最近公共祖父也在右子树上。只有root在p,q之间(闭区间),root才是最近公共祖父。
迭代:按序遍历

二叉搜索树的修改与构造

二叉搜索树中的插入操作

701. 二叉搜索树中的插入操作
后序遍历搜索二叉树,当遇到null时,说明找到了符合的位置,new一个新结点返回就好。若root不是null,最后的返回值是root。
不要全遍历搜索二叉树,利用搜索二叉树的特性去遍历。也可以迭代实现,需要一个变量记录要插入结点的父节点。
递归:顺序无所谓,通过递归函数返回值添加节点
迭代:按序遍历,需要记录插入父节点,这样才能做插入操作

二叉搜索树中的删除操作

450. 删除二叉搜索树中的节点
难点在于找到要删除的结点后,如何把这个结点的左右孩子融合成一颗搜索二叉树,只要融合好了,返回根节点就好了。对于左右孩子都是非空的情况,有两种处理方式,一是左孩子充当右孩子最靠左的孩子的左孩子,然后返回右孩子;二是右孩子充当左孩子的最靠右的孩子的右孩子。
递归:前序,想清楚删除非叶子节点的情况
迭代:有序遍历,较复杂

修剪二叉搜索树

669. 修剪二叉搜索树
如果一个的节点不在区间内,不再像前面那样,融合左右孩子然后返回给上一层,而是返回左孩子或右孩子的递归结果,因为一个节点不在区间内,那么它的左孩子或右孩子也一定不在区间内,直接排除掉一半的情况。
如果根节点在区间内,则递归调用左右孩子,返回结果充当根节点的新的左右孩子。
递归:前序,通过递归函数返回值删除节点
迭代:有序遍历,较复杂

构造二叉搜索树

108. 将有序数组转换为二叉搜索树
只要每次new的结点都是区间最中间的数,生成的二叉树就是平衡二叉树。
找到数组的中间的元素,作为根节点,递归剩余的左右两半,返回的结点作为根节点的左右孩子。
递归不要创建新的数组,使用数组下标来划分区间
递归:前序,数组中间节点分割
迭代:较复杂,通过三个队列来模拟
阶段总结

最后总结
「在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,Carl给大家大体分分类」。

涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序, 二叉树:找所有路径也用了前序,这是为了方便让父节点指向子节点。

所以求普通二叉树的属性还是要具体问题具体分析。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值