返回
路飞:二叉搜索树合法性判断
前端
2023-11-19 11:36:53
二叉搜索树是一种广泛应用于计算机科学中的数据结构,具有高效查找、插入和删除等优点。然而,若一棵二叉树不满足二叉搜索树的性质,则无法高效地执行上述操作。因此,对二叉搜索树的合法性进行判断就显得十分必要。
让我们首先回顾一下二叉搜索树的特点:
- 每个节点的左子树的所有节点值都小于该节点的值。
- 每个节点的右子树的所有节点值都大于该节点的值。
- 左右子树也都是二叉搜索树。
根据这些特点,我们可以使用递归或迭代的方法来判断一棵二叉树是否合法。
递归法
递归法是一种从顶向下分解问题的思想。我们可以从二叉树的根节点开始,然后递归地判断其左右子树是否合法。如果左右子树都合法,并且满足二叉搜索树的性质,那么整棵树就是合法的。
def is_bst(root):
"""
判断一棵二叉树是否为合法的二叉搜索树。
Args:
root: 二叉树的根节点。
Returns:
如果二叉树合法,返回True;否则,返回False。
"""
# 如果树为空,则直接返回True。
if root is None:
return True
# 判断左右子树是否合法。
left_is_bst = is_bst(root.left)
right_is_bst = is_bst(root.right)
# 判断左右子树是否满足二叉搜索树的性质。
if left_is_bst and right_is_bst:
if root.left is None or root.left.val < root.val:
if root.right is None or root.right.val > root.val:
return True
# 如果左右子树不合法,或者不满足二叉搜索树的性质,则返回False。
return False
迭代法
迭代法是一种从底向上解决问题的思想。我们可以从二叉树的叶子节点开始,然后依次往上判断其父节点是否合法。如果所有节点都合法,并且满足二叉搜索树的性质,那么整棵树就是合法的。
def is_bst(root):
"""
判断一棵二叉树是否为合法的二叉搜索树。
Args:
root: 二叉树的根节点。
Returns:
如果二叉树合法,返回True;否则,返回False。
"""
# 使用栈来存储待处理的节点。
stack = []
# 使用一个变量来存储上一个访问过的节点。
prev = None
# 从根节点开始遍历二叉树。
while root or stack:
# 如果当前节点不为空,则将其压入栈中,并继续遍历其左子树。
while root:
stack.append(root)
root = root.left
# 如果当前节点为空,则说明已经遍历到了叶子节点。
# 弹出栈顶节点,并判断其是否合法。
root = stack.pop()
if prev is not None and root.val <= prev.val:
return False
prev = root
# 继续遍历右子树。
root = root.right
# 如果遍历完所有节点,则说明二叉树合法。
return True
二叉搜索树是一种十分重要的数据结构,具有高效查找、插入和删除等优点。因此,对二叉搜索树的合法性进行判断就显得十分必要。本文介绍了两种判断二叉搜索树合法性的方法:递归法和迭代法。希望读者能够熟练掌握这两种方法,以便在实际工作中灵活应用。