98. 验证二叉搜索树(Medium)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
### 0204 递归(44 ms,17.1 MB)
def isValidBST(self, root: TreeNode) -> bool:
def dfs(root, lower, upper):
# 若当前节点非空,直接返回True
if not root: return True
# 每次递归都需要获取当前节点的值,用于与其左右子树进行大小比较
val = root.val
# 1.比较当前节点是否符合二叉搜索树定义
if val <= lower or val >= upper:
return False
# 2.比较当前节点的左子树是否符合二叉搜索树定义
if not dfs(root.left, lower, val):
return False
# 2.比较当前节点的右子树是否符合二叉搜索树定义
if not dfs(root.right, val, upper):
return False
return True
# 初始化上下边界为正、负无穷
return dfs(root, float('-inf'), float('+inf'))
### 0204 迭代(中序遍历)(52 ms,17 MB)
def isValidBST(self, root: TreeNode) -> bool:
# 初始化中序遍历的第0个值为负无穷
stack, last_val = [], float('-inf')
while root or stack:
# 迭代寻找最左叶节点
while root:
stack.append(root)
root = root.left
# 从最左边的节点开始判断
root = stack.pop()
# 若当前值小于等于上一个值,则不满足二叉搜索树
if root.val <= last_val:
return False
last_val = root.val # 更新当前的中序遍历值
root = root.right # 紧接着判断其右子树(满足中序遍历)
return True
958. 二叉树的完全性检验
450. 【仍为二叉搜索树】删除二叉搜索树中的节点
- 官方题解(递归、迭代)
- 解法1:递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
# 递归
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if root:
# 要删除的节点在右子树
if root.val < key:
root.right = self.deleteNode(root.right, key)
# 要删除的节点在左子树
elif root.val > key:
root.left = self.deleteNode(root.left, key)
# 要删除的节点恰好为当前根节点
else:
# 左子树 or 右子树为空
if not root.left or not root.right:
root = root.left if root.left else root.right
else:
node = root.left
# 找到当前根节点的左子树的最右节点
while node.right:
node = node.right
# 删除指定的节点
node.left = self.deleteNode(root.left, node.val)
node.right = root.right
root = node
return root
- 解法2:迭代(更优、但更复杂,看上面的官方题解)