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


    # Definition for a binary tree node.
    '''
    搜索二叉树,是一个左子树小于根节点小于右子树的特殊二叉树。
    '''
    # 这道题使用递归的方法来做,有删除的节点有四种情况,
    # 1,是叶子节点。没有孩子。
    # 2,有一个左孩子。直接让左孩子即为就好了。
    # 3,有一个右孩子。 直接让右孩子即为。
    # 4,左右孩子都有。 有两种办法。
    # (1),找到左孩子值最大的节点,左子树一直向右遍历。
    # (2),找到右孩子值最小的几点,右子树一直向左遍历。
    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: TreeNode, key: int) -> TreeNode:
    # 如果root为空,直接返回。
    if root is None:
    return root
    # 先寻找到需要删除的节点。
    if root.val > key:
    root.left = self.deleteNode(root.left,key)
    elif root.val < key:
    root.right = self.deleteNode(root.right,key)
    else:
    # 没有孩子,那么直接删除,然后返回。
    if root.left is None and root.right is None:
    root = None
    return root
    # 有左孩子,让左孩子即为。
    elif root.left and root.right is None:
    tmp = root.left
    root = None
    return tmp
    # 只有右孩子,让右孩子即为。
    elif root.right and root.left is None:
    tmp = root.right
    root = None
    return tmp
    else:
    # # 左右孩子都存在。1,寻找右孩子的最小值。
    # curr = root.right
    # # 右孩子向左递归,就是右孩子的最小值。
    # while curr.left:
    # curr = curr.left
    # # 让右孩子的最小值即为。
    # root.val = curr.val
    # # 删除掉那个节点。
    # root.right = self.deleteNode(root.right,curr.val)


    # 2,寻找左孩子的最大值。
    curr = root.left
    while curr.right:
    curr = curr.right
    root.val = curr.val
    root.left = self.deleteNode(root.left,curr.val)
    return root


  • 相关阅读:
    编译安装MongoDB C++ Driver (win8.1 vs2013)
    Convert Sorted Array to Binary Search Tree
    Sqrt(x) 牛顿迭代法
    Sublime Text 2 新建C++ build system
    Add Two Numbers
    Two Sum *
    从TCP协议的原理来谈谈rst复位攻击
    【转载】专访阿里陶辉:大规模分布式系统、高性能服务器设计经验分享
    一个低级Illegal instruction错误的定位--忽略编译期警告就得加倍偿还
    【转载】“惊群”,看看nginx是怎么解决它的
  • 原文地址:https://www.cnblogs.com/cong12586/p/14357676.html
Copyright © 2020-2023  润新知