【LeetCode】删除二叉搜索树中的节点

删除二叉搜索树中的节点

题目链接:https://leetcode-cn.com/problems/delete-node-in-a-bst/

题目大意:删除指定key的节点,返回root

分析:树是二叉搜索树,要求返回后仍然保持搜索树的位置

二叉搜索树:根节点值大于左孩子值,根节点值小于右孩子值

根据待删除节点的情况,我们可以采取不同的措施

  • 如果目标节点大于当前节点值,则去右子树中删除;

  • 如果目标节点小于当前节点值,则去左子树中删除;

  • 如果目标节点就是当前节点,分为以下三种情况:

    • 其无左子:其右子顶替其位置,删除了该节点;
    • 其无右子:其左子顶替其位置,删除了该节点;
    • 其左右子节点都有:其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替其位置,由此删除了该节点。

    第三种情况如图:

  • 时间复杂度:O(H),H是树的高度,寻找目标节点最坏情况需要O(H),删除操作最坏情况也需要O(H);
  • 空间复杂度:O(H),递归栈的深度最坏情况为树的高度;
func deleteNode(root *TreeNode, key int) *TreeNode {
	if root==nil{
		return nil
	}

	if key>root.Val{
		// 目标值大于当前值,则去当前节点的右子树中删除
		root.Right=deleteNode(root.Right,key)
	}else if key

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