一个星期之前在leetcode上刷了一些二叉树的题,整体感觉是:难但是也只是书上简单的三种遍历 、查找和层序遍历的应用,一些所谓的比较“难”的题只是同时应用其中的好几个,或者一种遍历用了好几遍。
说来也好笑,在刷题的过程中我总结了很多的...呃...可以说是结论吧,但是现在发现记录下的结论都是一些基操,也就是二叉树递归的过程不熟悉导致的结果。下面是刷题过程中的笔记:
前序遍历:节点是子问题 第k层的节点数 记录路径
中序遍历:左子树可以解决问题就不需要右子树 (查找)距离是k的节点
后续遍历: 最小子问题是叶子节点的父亲 交换左右子树,最大路径和
{}...递归之前是对单个节点的处理,
那就只看单个节点就好了,主要看空节点,根节点,叶子节点,父节点+题目特殊要求
F(root->left)==左子树==左节点
{}...中间是对左孩子结果的处理
F(root->right)==右子树==右节点
{}..递归之后是对左右孩子的处理
先写出来,画图去修改。
切割问题,分成可以解决的子问题,每个题都要这样做。
先想思路再写递归的两个函数,再写对单个节点的处理,然后画图去修改
记下一个栈帧图
遍历/分治
当逐渐熟悉了二叉树的递归过程之后发现真正有用的是其实是最后的五句。但是现在想来这也是一个过程,必须自己感受过这个过程,自己思考过,才能形成自己的思路。也是这个二叉树能让我沉浸一个下午的时间去思考解法,也是很不错的。