二叉树的特殊运用(BST)

本文旨在分享关于二叉搜索树(BST)的实战经验,包括BST的特性、如何解决平衡问题,以及基本操作如查询、插入和删除节点的模板。文中通过LeetCode题目举例,解释了如何利用BST的左小右大特性来高效地执行这些操作,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

     前言>写此文章的主旨中心是为了给阅读的同学提供一个只有干货+实战的心得体会, 方便没有自己的学习路线的同学能够快速了解一些问题的核心以及解决问题的思路.

           当然了这些内容也不是自己思考出来的,也是通过学习别人的内容总结归纳出来的,所以对于博主来说也是一个学习成长以及记录的过程, 有一些不足之处还请谅解, 希望大家都能共同进步, 汲取更多的知识, 早日找到中意的工作~
 

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的常见题型与解决方案的代码示例,希望大家能够自己动手多多实践.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值