1、 需要记忆的部分:

     分治法的基本思想是将一个规模为n 的问题分解为k 个规模较小的子问题,这些子问题互相独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。

对于二叉树问题,首先需要熟练记住二叉树的前序中序遍历的递归版本和迭代版本,后序也可以看一下,记住BFS的实现过程,归并排序,快速排序,二叉搜索树BST。

完全二叉树:左右节点高度差不能超过1;

二叉搜索树:root左边的节点都小于root,root右边的节点都大于root的值。判断标准是:中序遍历是一个增序列。

AVL平衡二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

总结:

1)二叉树问题基本都是考察递归,几乎所有的二叉树问题时间复杂度都是O(N),空间复杂度和二叉树的高度有关系,因为每一次递归都需要系统内存开一个栈空间进行存储,

2)其中递归函数中使用void的函数是遍历版本,使用有返回值的函数是分治版本,使用全局变量会影响多线程,

3)helper函数是在递归中使用的,因为原有的函数可能只返回一个值,而中间的递归过程需要返回多个值,此时就需要再写一个helper函数

4)在求最大值问题时候,非法情况需要些root = NULL,此时返回一个负无穷大;

再求最小值问题的时候,此时返回一个正无穷大。

写分治自己的感悟是,先想想最简单的情况是怎么写的。

 

二叉树问题思考过程:首先r思考递归基的情况root ==NULL,return;

然后思考左右子树递归完有什么实际意义,然后分别进行处理;

2、下面是二叉树问题的模板:

1)遍历形式的模板;

2专题总结-二叉树
Template 1: Traverse

public class Solution {
    public void traverse(TreeNode root) {
        if (root == null) {
            return;
        }
        // do something with root
        traverse(root.left);
        // do something with root
        traverse(root.right);
        // do something with root
    }
}
Template 1: Traverse

相关文章: