LeetCode之树的总结与分析

1、树的分类与特点

二叉树的左右子树都是二叉树,是用递归定义的,因此解决二叉树的许多问题都可以使用递归方法进行解决

  • 二叉排序树的中序遍历就是树中接点按照顺序输出的顺序

做个总结,处理递归问题时:

  • 将树当作 ,左子树,右子树三部分,左子树、右子树具体是什么样的不管
  • 找出终止条件,就是什么时候returnreturn什么
  • 只考虑当前这一步要完成什么功能

2、二叉树的常见技巧

  • 二叉排序树往往可以采用中序遍历
  • 对可以从非根节点开始的计算,往往可以采用递归的方式进行计算
  • 求树中满足某个条件的所有组合时,往往需要采用回溯的算法

3、二叉树问题分类与分析

3.1、二叉树的遍历/查找(二叉树节点的和、二叉树的前中序)

  • 往往需要递归的调用获取左子树和右子树的计算处理结果,然后再左右子树得到的结果上计算(`分析好如何通过左右子树得到计算结果,以及方法返回的是什么),有时附带着算需要计算的数据
  • 计算任意子结构的某个值,往往需要定义一个全局变量,在遍历每个子结构的时候,对这个值可以进行一定的更新
  • DFS,BFS

二叉树递归之几个相似问题的分析–在递归树的时候统计树的某种特征

  • 二叉树最小深度

  • 平衡二叉树:递归:当前节点的左右子树的深度差不大于1,并且左子树和右子树的左右子树的深度高度差不大于1

  • 二叉树的直径首先要高清什么是二叉树的直径,任意两个节点路径长度中的最大值;可以经过根也可以不经过根,因此在遍历的过程中需要定义一个全局变量,确保不断更新,获取 全局的值;分析可得 直径=Math.max(遍历过程中的上次直径,(左子树的深读+右子树的深度));而深度=Math.max(左子树的深度,右子树的深度)+1

  • 最长的同值路径:首先要搞清什么是同值路径,每个路径中的节点具有相同的值;可以经过根也可以不经过根,在遍历的过程中需要定义一个全局变量,获得全局值;经过分析:先获取左侧最长路径长度,再获取右侧最长路径长度,在分析包含该节点的最长路径长度,更新双侧最长路径长度,更新单侧最长路径长度;和上提类似

  • 二叉树中的最大路径和:求取二叉树节点(任意节点)的最大路径和,即抽取二叉树中任意连续节点的和的最大值,与前两题类似,首先计算左子树的值,计算右子树的值,然后计算加上节点的最大值(定义一个全局变量进行保存),返回当前节点的最大值,从左右子树中挑一个最大的即可

  • 给定二叉树的所有左叶子节点之和分析:遍历左子树,再遍历右子树,分析当前节点的左子节点是否存在,以及当前节点的左子节点是否为叶子节点如果则加上

  • 路径之和求从根节点到叶子节点是否存在和为某个值递归遍历,若当前节点为叶子节点并且当前叶子节点的值为sum则返回true,否则遍历左右子节点

  • 路径之和求从根节点到叶子节点等于某个值的·所有路径递归加回溯

  • 路径之和求任意两个节点之间的和等于某个值的所有路径双重递归,首先先序递归遍历每个节点,再以每个节点作为起始点递归寻找满足条件的路径

  • 求根到叶子节点数字之和采用递归+回溯

  • 出现次数最多的子树元素和

3.2、二叉树的结构分析(深度、子结构)

  • 一颗树是否为另一颗树的子树:通过递归的方式解决
  • 相同的树判断当前节点是否相等,以及当前节点的左子树是否相等且右子树是否相等
  • 镜像二叉树什么是镜像的呢?分析树的结构,一个节点的左子节点以及右子节点是否相等,左子节点的左子树与右子节点的右子树相等并且左子节点的右子树与右子节点的左子树相等
  • 叶子相似的树:通过中序遍历将树的叶子节点进行保存,然后比较两颗树的叶子节点即可。

3.3、排序二叉树(有特点的二叉树)

二叉排序树小结>>>

3.4、树的重建

  • 翻转二叉树采用深度和广度优先搜所进行操作
  • 合并二叉树:采用递归:采用哨兵机制可以解决很多问题,合理使用哨兵机制,在原有的树的基础上进行合并,比如合并到树1上,如果树1中的节点为空,则将树2中节点的值复制到这个位置;如果树2中节点为空,则保留树1中的节点;若两个节点都不为空,则相加;然后再合并两个节点的左子树和右子树;对当前节点怎么处理以及对当前节点的子树如何处理是递归的关键
  • 递增顺序查找树:我们在树上进行中序遍历,会将树中的节点之间重新连接而不使用额外的空间,具体的,当我们遍历到一个节点时,把它的左孩子设为空,并将其本身作为上一个遍历到的节点的右子树
  • 将有序数组转换为二叉搜索树有序数组可以使用二分查找
  • 将有序链表转换为二叉搜索树采用二分查找法:和数组的类似,将链表分为两部分,左边的为左子树,右边的为右子树
  • 根据前序(后)序与中序遍历重构二叉树:在前序(后序)序列中确定根节点到中序序列中找到根节点的位置,则中序序列的前面是左子树,在其右面的是右子树,则可采用分治算法与递归接着处理
  • 二叉树转换为链表:递归的方法,先处理左子树,再处理右子树为链表
  • 填充每个节点的下一个右侧节点指针:可以采用BFS,也可以采用dfs,我们以当前节root点为起始,左右节点不断的深入下面,left节点不断往右走,right节点不断往左走,当这两个节点走到底后,整个纵深这段就完成了串联。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值