二叉搜索树
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。
BST 的基础操作:判断 BST 的合法性、增、删、查。
本文通过两个实例来介绍如何用二叉搜索树的特性来实现 「搜索」和「增加」 操作。
700. 二叉搜索树中的搜索
解法:递归
普通二叉树的搜索需要遍历所有节点来进行依次判断。而对于二叉搜索树,可以利用其左小右大的特性,做类似⼆分搜索的操作,提高搜索⼀个元素的效率。此时对于任一节点的「该做什么」判断如下:
- 若当前元素小于目标值,则进入左子树搜索
- 若当前元素大于目标值,则进入右子树搜索
- 若相等,则返回当前节点
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:
return None
if root.val == val:
return root
elif root.val > val:
result = self.searchBST(root.left, val)
else:
result = self.searchBST(root.right, val)
return result
701. 二叉搜索树中的插入操作
解法:递归
对数据结构的操作⽆⾮遍历 + 访问,遍历就是「找」,访问就是「改」。具体到这个问题,插⼊⼀个数,就是先找到插⼊位置,然后进⾏插⼊操作。
上⼀个问题,我们总结了 BST 中的遍历框架,就是「找」的问题。直接套框架,加上「改」的操作即可。⼀旦涉及「改」,函数就要返回 TreeNode 类型,并且对递归调⽤的返回值进⾏接收。
class Solution:
def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:
# 找到插入位置,进行修改
return TreeNode(val)
if root.val > val:
# 接收返回值
root.left = self.insertIntoBST(root.left, val)
else:
# 接收返回值
root.right = self.insertIntoBST(root.right, val)
return root
总结
- 体会二叉搜索树与普通二叉树的搜索过程的异同点。
- 体会插入和搜索操作的不同之处。