前言

在我们做二叉树的基础算法题目的时候一定需要异常熟练的掌握以下知识点,这样写二叉树的题目才能游刃有余

写二叉树前必须非常熟练的掌握如下:

  1. 先中后序遍历递归与非递归
    二叉树的先中后序遍历的递归与非递归写法,必须非常熟练的写,并且非递归写法有常见的两种写法(一种是严蔚敏版的一种是先存入一个结点到栈中,然后每次循环把该结点的所有直接孩子结点全部入栈),必须非常熟练的掌握

  2. 层次遍历的队列写法
    二叉树的层次遍历的写法(用队列实现),必须非常熟练的写,并且要非常熟练的写两种,一种一个个入队,另一种一层层入队

  3. 深度的递归和非递归
    求二叉树深度的递归和非递归写法必须非常熟练

  4. 结点个数的递归和非递归
    同样也是非常熟练,不能含糊

  5. 叶子结点个数的递归和非递归
    同样必须非常熟练

  6. 常见题型必须要熟练到背诵的程度
    镜像二叉树,翻转二叉树,有序数组创建二叉搜索树,最近公共祖先,最长路径这几个最常见的超高频考点

题型

二叉树题型其实也是多种多样的,百分之 80 以上的二叉树基础题目都可以用递归解决,而且对于能够递归的我们建议递归,何必用栈麻烦的去实现,当然若是简单基础的题目我们也建议用栈去练练手,这也是非常有益处的!

最基本的解题思路:

基本思路是用递归遍历整个树,然后在每个结点处进行某个条件的判断或者说是某个条件值的累计计算,当我们遍历完整棵树的时候就可以拿到结果了。

题型往往会结合以下考点

除了我上面说的最基础的解题思路外,二叉树的题目还充斥这些考点

  • 递归的使用,甚至双重递归
  • 栈的熟练使用
  • 队列的熟练使用
  • DFS
  • BFS
  • 回溯

一些关键的思想要掌握:

  • 只要涉及到二叉树求路径长度的类似问题,本质就是往求二叉树深度的递归问题去转化
  • 可以试着画一个二叉树的示意图,然后自己打箭头模仿先中后序以及层次遍历的结点流向,这对于理解 DFS,BFS,回溯非常的有帮助
  • 先序遍历是从上到下的 DFS,中序则是标准的从下到上的 DFS,后序则是不标准的从下到上的 DFS
关键词

递归,遍历整棵树,每个结点作判断

算法步骤

这里只做最基本解题的步骤,二叉树的题目往往题型众多,不太好全部归一为一种

  • 1.递归传参的选择

    比如 root 结点最为最开始递归方法的传参,当然复杂一点的不会只传一个 root 结点,还有其他需要附带的参数,这个需要思考遍历到每个结点的时候什么参数还需要被用到

  • 2.设立递归出口

    最基础的题目递归出口即为

    if(root == null)
    	return null;
    

    稍微复杂一点的递归的出口需要自己去思考去想遍历到最深处如何出来

  • 3.递归遍历整棵树

    使用递归来遍历整棵二叉树,先中后需要自己选择

  • 4.遍历到每个结点需要作何种判断

    这一步算是最关键的一步,我们求二叉树的算法题目都是要遍历整棵树的,遍历的形式很好写,遍历到某个结点时候我们如何去做判断,做什么判断,比如说判断这个结点的值是否是某个值这么简单?或者是左边结点递归和右边结点递归二者之间的比较判断?这个也需要思考怎么去写,这个麻烦一点