算法训练营day19,二叉树8-2

type TreeNode struct {

  Val   int

  Left  *TreeNode

  Right *TreeNode

}

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

/*本题比较难,删除节点要分五种情况考虑

1.没有找到要删除的节点

2.找到要删除的节点是叶子节点

3.找到要删除的节点,左指针不为空,右指针为空

4.找到要删除的节点,左指针为空,右指针不为空

5.找到要删除的节点,左指针不为空,右指针不为空,这种情况最复杂,需要调整二叉树结构,既可以让左子树继承,也可以让右子树继承

*/

//根据上述分析,第五点让右子树继承写法

func deleteNode(root *TreeNode, key int) *TreeNode {

//1.未找到要删除的节点

  if root == nil {

    return root

  }

  if root.Val == key {

      //2.找到要删除的节点是叶子节点

    if root.Right == nil && root.Left == nil {

      return nil

  // 3.找到要删除的节点,左指针不为空,右指针为空

    } else if root.Left != nil && root.Right == nil {

      return root.Left

//4.找到要删除的节点,左指针为空,右指针不为空

    } else if root.Left == nil && root.Right != nil {

      return root.Right

    } else {

     //5.找到要删除的节点,左指针不为空,右指针不为空,让右子树继承

      cur := root.Right

      for cur.Left != nil {

        cur = cur.Left

      }

      cur.Left = root.Left

      return root.Right

    }

 //因为是而二叉搜索树key比root值小,向左递归

  } else if key < root.Val {

    root.Left = deleteNode(root.Left, key)

//比root值大向右递归

  } else if key > root.Val {

    root.Right = deleteNode(root.Right, key)

  }

  return root

}

//第五点让左子树继承写法

func deleteNode(root *TreeNode, key int) *TreeNode {

  if root == nil {

    return root

  }

  if root.Val == key {

    if root.Right == nil && root.Left == nil {

      return nil

    } else if root.Left != nil && root.Right != nil {

      cur := root.Left

      for cur.Right != nil {

        cur = cur.Right

      }

      cur.Right = root.Right

      return root.Left

    } else if root.Left != nil {

      return root.Left

    } else {

      return root.Right

    }

  } else if key < root.Val {

    root.Left = deleteNode(root.Left, key)

  } else if key > root.Val {

    root.Right = deleteNode(root.Right, key)

  }

  return root

}