前言>写此文章的主旨中心是为了给阅读的同学提供一个只有干货+实战的心得体会, 方便没有自己的学习路线的同学能够快速了解一些问题的核心以及解决问题的思路.
当然了这些内容也不是自己思考出来的,也是通过学习别人的内容总结归纳出来的,所以对于博主来说也是一个学习成长以及记录的过程, 有一些不足之处还请谅解, 希望大家都能共同进步, 汲取更多的知识, 早日找到中意的工作~
1.平衡二叉树问题解决方式--依据其主要特性
1)左小右大: 即对于一个节点来说, 它的每一个左子树的节点都比当前节点的值小, 每一个右子树的节点值都比当前节点的值大
2)中序有序: 依据左小右大的特性, 按照左->根->右的顺序遍历的BST, 能够保证整体上是一个升序的数组
常规上的BST的问题, 都可依据以下特性考虑, 例如->leetCode538将二叉树搜索树转化为累加树
从题目上入手, 本身是BST, 对于每一个节点, 当前节点的值变化为所有大于该节点的值与该节点的值的和, 依据左小右大的性质, 对于一个有序数组的其中一个节点, 所有大于等于该节点的值都在其中一侧, 所以我们可以依据此将其转化成一个反向的升序序列, 即降序排列, 从序列的根节点一次累加和, 代码如下:
2.BST的基本操作题型-查询, 插入, 删除, 判断是否BST
这类问题的主要切入点还是依据BST的左小右大的特性, 因为存在特性, 总会存在一些便利, 比如我们需要查询一个节点, 常规的 遍历二叉树也可以做到, 为什么要提到BST, 依据BST写出一套查询模板如下>
相关运用:
对于一棵BST查询指定的节点val, 对应leetcode700, 我们可以写出如下代码
对于插入,以及删除问题, 本质上还是依据特性套用相应的查询模板, 在指定的位置进行调整相应的树结构, 比如插入问题leetcode 701, 相当于找到一个空节点, 插入元素使得其保持BST的特性即可
在此基础的的删除问题, 本质上也是套用同样的模板,无非就是在删除的处理上存在一定的考量, 代码如下:
可以看到大方向上还是在套用上述的模板, 在删除指定节点时, 我们采用的方式没有调整指针, 而是直接切换当前要删除节点的值转换成 左子树的最大值, 或者右子树的最小值, 保证其BST的特性.
3.BST的构造
构造一棵BST的方式可直接参考之前总结过的二叉树的构造, 只需保证其特性的基础上插入每一个元素即可, 比如 1,2,3,4,5 以3为根节点, 则左子树只能由1,2构造, 右子树只能由4,5构造
比如leetcode96不同的二叉搜索树,代码如下:
以上即为常见的对于二叉树的变种-BST的常见题型与解决方案的代码示例,希望大家能够自己动手多多实践.