leetcode.450.删除二叉树中的节点

450.删除二叉树中的节点

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

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 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

中序立即先行者:在该节点的左子树往右寻找,直到该节点的右子针为None,这个节点就是中序立即先行者。
中序立即后继者:该节点的右子树往左寻找,直到左子针的为None.
伪代码

MinNode(x)
	'''
	返回后继者
	'''
	if x.left == NIL
		return x
	return MinNode(x.left)
DeleteMin(ptr)
'''
主程序
'''
	'''
	返回删除了后继者的右子树
	'''
	if ptr.left == NIL
		return ptr.right
	ptr.left = DeleteMin(ptr.left)
	return ptr
DeleteNode(root,key)
	if root == NIL#如果树根为NIL,就返回NIL
		return NIL
	if root.val > key#如果key在左子树中,就修改root的左子树
		root.left = DeleteNode(root.left,key)
		return root
	else lif root.val < key#如果key在右子树中,就修改root的右子树
		root.right = DeleteNode(root.right,key)
		return root
	else:
	#如果key就是在root
	##如果key只有左子树,就返回它的左子树
		 if root.right == NIL
			return root.left
	##反之如果key只有右子树,就返回它的右子树
		else lif root.left == NIL
			return root.right
	## 如果root,有两个子树,可以返回root的先行者或者后继者,这里以后继者为例
		else:
			succnode = MinNode(root.right)#succnode是后继者
			succnode.right = DeleteMin(root.right)#返回删除了后继者的右子树
			succnode.left = root.left #后继者的左子树就是树根的左子树
			return succnode #返回后继者	

python实现


class Solution(object):
    def deleteNode(self, root, key):
        """
        :type root: TreeNode
        :type key: int
        :rtype: TreeNode
        """
        def minnode(x):
            '''
            返回最小关键字
            '''
            if x.left == None:
                return x
            return minnode(x.left)
        def deleteMin(ptr):
            '''
            反回删除了最小关键字的二叉树
            '''
            if ptr.left == None:
                return ptr.right
            ptr.left = deleteMin(ptr.left)
            return ptr
        
        if root == None:
            return None
        if root.val > key:
            #如果key在左子树中
            root.left = self.deleteNode(root.left,key)
            return root
        elif root.val < key:
            #如果key在右子树中
            root.right = self.deleteNode(root.right,key)
            return root
        else:
            #如果key在root上
            ## 如果root只有左子树
            if root.right == None:
                return root.left
            ## 如果root只有右子树
            elif root.left == None:
                return root.right
            ## root有两个子树,返回root的后继
            else:
                succnode = minnode(root.right)
                succnode.right = deleteMin(root.right)
                succnode.left = root.left
                return succnode

猜你喜欢

转载自blog.csdn.net/qq_20966795/article/details/85207175