Python 3は二叉検索ツリーのノードの削除を実現


に質問
ツリーのルートノードrootと値keyを指定し、ツリー内のkeyに対応するノードを削除し、ツリーの性質が変わらないことを保証します.ツリー(更新される可能性がある)のルートノードの参照を返します.
一般に、ノードを削除するには、次の2つのステップに分けられます.
まず削除するノードを見つけます.見つかったら削除します.説明:アルゴリズムの時間複雑度はO(h),hはツリーの高さであることが要求される.
例:
root = [5,3,6,2,4,null,7]
key = 3

    5
   / \
  3   6
 / \   \
2   4   7

            3,         3     ,     。

         [5,4,6,2,null,null,7],      。

    5
   / \
  4   6
 /     \
2       7

         [5,2,6,null,4,null,7]。

    5
   / \
  2   6
   \   \
    4   7

解析
  • ターゲットノードにサブノードがない場合、ターゲットノードを直接削除できます.
  • ターゲット・セクションにサブノードが1つしかない場合は、そのサブノードを置き換えることができます.
  • ターゲットノードに2つのサブノードがある場合、ターゲットノードを削除するには、後続ノードまたは前駆ノードの順序で置き換える必要があります.

  • コード:
    ツリーの定義:
    class TreeNode:
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    

    ノードの削除方法:
       def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
            if root is None:
                return None
            if root.val == key:
                if root.left is None:
                    if root.right is None: #    ,    
                        return None
                    else:
                        root = root.right #       ,      
                elif root.right is None:
                    root = root.left #       ,      
                else:
                    buffer = None #buffer             
                    tmp = root.right
                    while tmp.left is not None:
                        buffer = tmp
                        tmp = tmp.left
                    root.val, tmp.val = tmp.val, root.val
                    if buffer is None: #buffer  , root            
                        root.right = self.deleteNode(tmp, key)
                    else:
                        buffer.left = self.deleteNode(tmp, key)
            elif key < root.val:
                root.left = self.deleteNode(root.left, key)
            else:
                root.right = self.deleteNode(root.right, key)
            return root