450. 删除二叉搜索树中的节点
450. 删除二叉搜索树中的节点
思路
根据题目定义,递归方法要返回将key节点删除后的根节点,可能是原根节点,也可能不是
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
那么递归终止条件就有2种:
- 没找到节点,比如遍历到空节点就算没找到节点,直接将None返回给上一层递归
- 找到了节点,返回当前递归层中新的根节点
找到节点后,节点可能是以下几种情况:
a. 左右子节点都没,直接返回None(因为要删除这个节点,返回None给上一层,上一层root.left=None 或者上一层root.right=None)
b. 有左子节点没有右子节点,直接吧左节点当成当前节点,返回root.left
c. 有右子节点没有左子节点,返回root.right
d. 左右子节点都有,根据二叉搜索树任意一个左边的节点 一定比任意一个右边节点小的特性,把root.right替换root,把root.left指向root.right的最左边的节点(root.right最左边的节点就是root.right这棵树中最小的节点)
单层递归要做的事:
key在root右边,去右子树递归,返回左子树将key节点删除后的根节点
key在root左边,去左子树递归,返回右子树将key节点删除后的根节点
# 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]:
# 找到这个节点,删除节点,返回删除后的根节点
# 递归方法返回:返回将二叉树的值为key的节点删除后的根节点
# 递归终止条件:1. root=None时应该返回上一层递归 2.找到该节点后节点删除,删除就是要return处理过的新的根节点
if not root:
return None
if root.val == key:
# 找到节点
if not root.left and not root.right:
return None
elif root.left and not root.right:
return root.left
elif not root.left and root.right:
return root.right
else:
# 根据二叉搜索树任意一个左边的节点 一定比任意一个右边节点小的特性,把让root.right替换root,把root.left指向root.right的最左边的节点
cur = root.right
while cur.left:
cur = cur.left
cur.left = root.left
return root.right
# 返回左子树的根节点和右子树的根节点
if root.val > key:
root.left = self.deleteNode(root.left, key)
if root.val < key:
right_node = self.deleteNode(root.right, key)
return root