前言>写此文章的主旨中心是为了给阅读的同学提供一个只有干货+实战的心得体会, 方便没有自己的学习路线的同学能够快速了解一些问题的核心以及解决问题的思路.
当然了这些内容也不是自己思考出来的,也是通过学习别人的内容总结归纳出来的,所以对于博主来说也是一个学习成长以及记录的过程, 有一些不足之处还请谅解, 希望大家都能共同进步, 汲取更多的知识, 早日找到中意的工作~
一.解决二叉树问题的核心策略大致分为两种:
1)遍历思维: 通过遍历一遍二叉树即可得出答案-对应回溯算法的核心
2)分解思维: 通过一个递归函数, 将问题分解为子问题得到答案-对应动态规划算法核心.
简单案例: leetcode104.二叉树的最大深度, 即根节点到最远叶子节点的最长路径节点数
1)通过遍历二叉树, 即可明确从根节点到每个叶子节点的最远路径, 不断更新即可, 所以有:
2)通过分解二叉树, 即明确根节点左(右)子树的最大深度, +1的结果即为根节点的最大深度, 所以有:
2.重点了解前中后序遍历二叉树的作用:
1)前序位置: 在进入一个根节点时可以进行的操作
2)中序位置: 在离开一个节点的左子树的最后一个节点, 即将进入右子树时可以进行的操作
3)后序位置: 在左右子树都遍历完时可以处理的操作, 可通过后序明确左右子树中的内容.
很多常用的算法均可抽象成以上的形式看待,比如:
a,归并排序: 本质上可以看成后序遍历, 先找到中位数节点, 以中位数分离两边数组进行排序, 最后进行合并(merge)操作, 其中merge即相当于后序位置的处理操作
b.快速排序: 本质上可以看成前序遍历, 先找到一个节点的精确位置, 以这个节点分成两个边界, 分别再去找两边数组中一个节点的精确位置不断递归.先找一个节点的准确位置这一操作, 相当于前序位置的处理操作.
3.重点明确后序位置的特殊性: 因其是在离开节点的位置添加的操作, 所以我们可以在此位置拿到对应左右子树的处理结果,
比如leetcode543.求二叉树的直径-可以看成求左右子树的最大深度之和
写成代码即是: