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

https://leetcode.cn/problems/delete-node-in-a-bst/

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。

示例 1:
450. 删除二叉搜索树中的节点(中等)_第1张图片
输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        # 星级:☆☆☆☆
        # 标签:递归法
        if not root:  # 遍历到叶子节点,也没找到key,直接返回
            return
        elif key > root.val:  # 要删的值比root大,向右递归
            root.right = self.deleteNode(root.right, key)
        elif key < root.val:  # 要删的值比root小,向左递归
            root.left = self.deleteNode(root.left, key)  
        else:  # 找到了等于key的root
            # 情况 1:如果 key 是叶子节点,直接删除
            # 情况 2:如果 key 只有左子树或右子树,让它的孩子接替自己的位置
            # 下面2个if 把第1、2种情况都包含了
            if not root.left:
                return root.right
            if not root.right:
                return root.left
            # 情况3:如果 key 左右子树都有
            if root.left and root.right:
                node = root.right
                while node.left:  # 获得root右子树(也就是key右子树)最小节点,右子树的最小值一定是左分支的左叶子节点
                    node = node.left
                node.left = root.left  # 将root的左子树接到node的左子树上
                root = root.right  # 将root值修改为root的右子树,删除了key        
        return root

你可能感兴趣的:(二叉树,数据结构,算法,python,leetcode)