leetcode刷题——BinaryTree

前言

终于刷到了二叉树这一个经典的题目,之所以说它经典,是因为它涉及的知识点很多。从数据结构的存储上来看,它与链表最相近,写起来也更复杂。

同时遍历涉及到策略,最基本也分为深度优先搜索和广度优先搜索,深度优先搜索又分为前序、中序、后序。

而解题思路又可以分为递归和迭代两种解法。递归本身就属于一种比较抽象的方式,虽然写起来可能相对简单,但想起来还是比较麻烦,要确定好递归的步骤,每步返回的值,以及最后终止条件,甚至是最开始调度递归的方式,传几个参数等等。

迭代解法又涉及到队列和栈,分别用在BFS和DFS上。


教程

大部分树的问题主要靠遍历解决,遍历基本上包括深搜索和广搜索,策略是递归或队列栈迭代。

比较经典适合递归题目:

  1. Symmetric Tree镜像树,使用广度优先搜索对比同级别是否镜像对称,使用递归比队列好用的多,比较出彩的是函数入口为(root,root)左右复制相互对比。我使用队列做的,把每一层的节点记录在散列表中,最后看每一层是不是回文,显然不如递归精巧。
  2. Path Sum全路径侦测sum值。很显然的深度搜索问题,使用递归加值就可以。递归传sum值。
  3. Maximum Depth of Binary Tree深搜找最深节点。递归传最大深度值。
  4. Construct Binary Tree from Inorder and Postorder Traversal中序和后序数组建立二叉树。主要根据后序是删除节点的顺序,因此也就是从跟节点,开始找起,同时中序符合二分的分治思路,进行不同的且分,将两个数组不断切小,分给左右节点解决了问题。这里可以看到递归与问题分解(分治)的结合。这道题算中等难度
  5. Construct Binary Tree from Prorder and Inorder Traversal,采用前序和后序数组建立二叉树。与4相近,都是使用递归和分治进行数组切分。
  6.  Lowest Common Ancestor of a Binary Tree,寻找公共祖先节点。给节点A,B找到公共最低祖先节点。其实也是递归深搜查找,获得深搜路径,然后返回路径数组。再将两个数组进行进行比较。
  7. Invert Binary Tree,逆转二叉树,白板经典。左右反转递归即可。
  8. Diameter of Binary Tree,树中最远两个节点求值。分治思想很明显,左右的节点分别取下面最远的节点距离l,r,然后+1求最大值为当前节点距离最远节点的距离max(l,r)返回。同时这里需要单独维护一个变量max_l记录比较这一层的max(max_l,l+r),最后取此值。这类计算树内极值比较问题基本都需要单独设立全局变量,与每一层递归中的值进行比较,而不能单独依靠递归中参数传递。
  9. Binary Tree Tilt,计算二叉树的倾斜度值,整个树的倾斜度依赖于每个节点下的倾斜度值。由于这个值就是递归中返回的参数因此不需要其他全局变量。

其实这里看出来,当递归传值的数据结构比较简单、计算关系(2,3,6为求和、最大、查找路径)时使用递归比较直观。

而当递归解决的问题比较复杂时候(1为比较,7为当前节点下子节点反转,8为树的最远距离等于每层节点最远距离最大值并+1,9与8相似)分治的思想往往就更明显,递归其实只是一种手段,这类问题具有比较明显的对称性,数据的范围被不断切分,因此比较复杂。

比较适合迭代解法的题目:

  1. Minimum Depth of Binary Tree,这道题与上面第三题看上去很相似,只不过是求最小值。一开始我们很容易想当然的使用深度遍历将每个节点的深度获取到,然后比较出最小值。但是其实最简单的方法是使用广度优先遍历,只要在每层的遍历过程中遇到叶子节点,那么当前深度就是最小值。

  2. Populating Next Right Pointers in Each Node II。这道题要求链接每层的节点。思路很明显,广度优先搜索遍历出每层节点到各个数组,然后链接即可。

  3. Average of Levels in Binary Tree。这道题更简单了,广度优先搜索一层节点的值,然后求平均值即可。

综合看来,广度优先搜索算法能解决的题一般比较明显,使用队列进行迭代即可。深度优先搜索相对麻烦一些,递归的操作要考虑参数传值、返回值类型、返回值计算再返回、终止条件、全局变量记录等因素。


在刷完二叉树的部分题目后,之后我们会将目光转向N叉树,来看一看N叉树相对二叉树适合解决的问题是哪些。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值