LeetCode 450.删除二叉树的节点

115 阅读1分钟

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

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

  • 首先找到需要删除的节点
  • 如果找到了,删除它。

image.png

image.png

var deleteNode = function(root, key) {
   if(!root) return null
   if(root.val === key){
       // 如果删除的节点有单一左或者右子树
       if(root.left === null) return root.right
       if(root.right === null) return root.left
       // 如果有左右子树,找到左子树最大值或者右子树最小值,然后删除
       // 再把删除的val赋值给root.val
       let next = root.right
       // 找出右子树最小值
       while(next.left) next = next.left
       // 删除
       root.right = deleteNode(root.right, next.val)
       // 重新赋值
       root.val = next.val
       return root
   }else if(root.val > key){
       root.left = deleteNode(root.left, key)
   }else if(root.val < key){
       root.right = deleteNode(root.right, key)
   }
   return root
};