b+树的增删改查_二叉搜索树相关题目的一些思路

631b2604cae3504d533c81ee0ad6c416.png

二叉搜索树的概念:

  • 若它的左子树不空,则左子树上所有结点的值均小于等于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于等于它的根结点的值。
  • 任意结点的左、右子树也分别为二叉搜索树。

由上可知,二叉搜索树中序遍历结果是递增的。

依据上面的概念,那如何构建一颗二叉搜索树呢?

确定一个根结点,然后递归去构建其左右子树。

// build(1, n);  // [1, n]

下面重点讲讲几道leetcode上关于二叉搜索树的经典例题吧。

二叉搜索树的增删改查

对于插入新的节点或者删除某个节点,我们比照这个节点值和当前搜索的节点值,通过判断大小关系,来移动搜索节点向左孩子或者右孩子移动。

递归三要素: 递归函数含义,递归退出条件, 递归状态转移。

701. 二叉搜索树中的插入操作

// 递归函数含义: 向root为根节点的二叉搜索树中插入值为val的节点,并返回根节点

450. 删除二叉搜索树中的节点

// 递归函数含义: 在以root为根节点的二叉搜索树上删除值为key的节点,

96. 不同的二叉搜索树

95. 不同的二叉搜索树 II

给定一个整数n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 96题需要满足条件的二叉搜索树个数,95题需要所有满足条件的二叉搜索树的结构情况。

在构建二叉搜索树时,我们只要确定好根节点,就可以依据左孩子右孩子和根节点值得大小关系递归构建左子树和右子树。

以1为根节点,则2..n构成右子树。

以2为根节点,则1构成左子树,3..n构成右子树。

...

在求解96题时,只要遍历1到n,看左子树和右子树分别由多少种构成情况,左子树构成情况数乘右子树构成情况数就是确定了根节点后的值。

同理95题中,我们就要把看左子树和右子树分别由多少种构成情况提前保存起来,类似笛卡儿积重组。

// 以下为95题代码

99. 恢复二叉搜索树

题目中说明二叉搜索树中的两个节点被错误地交换。先前我们知道二叉搜索树中序遍历结果是递增的,那说明现在错误交换后的二叉搜索树中序遍历结果不是递增的。

假设原先正确的二叉搜索树中序遍历结果: [1, 2, 3, 4, 5,6]

交换两个节点,则有以下两种情况:

  • 交换相邻的两个节点: 例如 [1, 2, 3, 4, 6, 5] // 需要交换 6 5
  • 交换不相邻的两个节点: 例如 [1, 5, 3, 4, 6, 2] // 需要交换 5 2

综上,我们只要找到两个需要交换的值。按照题目要求不改变二叉搜索树原来的结果,那我们直接交换这两个值就解决了这个问题。

class 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值