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

450. 删除二叉搜索树中的节点
在这里插入图片描述

思路

根据题目定义,递归方法要返回将key节点删除后的根节点,可能是原根节点,也可能不是
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
那么递归终止条件就有2种:

  1. 没找到节点,比如遍历到空节点就算没找到节点,直接将None返回给上一层递归
  2. 找到了节点,返回当前递归层中新的根节点
    找到节点后,节点可能是以下几种情况:
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值