LeetCode_二叉搜索树_中等_450.删除二叉搜索树中的节点

一时失言乱红尘 2023-10-06 22:27 131阅读 0赞

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

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

一般来说,删除节点可分为两个步骤:
① 首先找到需要删除的节点;
② 如果找到了,删除它。

示例 1:

在这里插入图片描述

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7],如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

在这里插入图片描述

示例 2:
输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:
输入: root = [ ], key = 0
输出: [ ]

提示:
节点数的范围 [0, 104].
-105 <= Node.val <= 105
节点值唯一
root 是合法的二叉搜索树
-105 <= key <= 105

进阶: 要求算法时间复杂度为 O(h),h 为树的高度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-bst

2.思路

(1)递归

3.代码实现(Java)

  1. //思路1————递归
  2. /**
  3. * Definition for a binary tree node.
  4. * public class TreeNode {
  5. * int val;
  6. * TreeNode left;
  7. * TreeNode right;
  8. * TreeNode() {}
  9. * TreeNode(int val) { this.val = val; }
  10. * TreeNode(int val, TreeNode left, TreeNode right) {
  11. * this.val = val;
  12. * this.left = left;
  13. * this.right = right;
  14. * }
  15. * }
  16. */
  17. class Solution {
  18. public TreeNode deleteNode(TreeNode root, int key) {
  19. if (root == null) {
  20. return null;
  21. }
  22. if (root.val == key) {
  23. //要删除的节点就是当前根节点
  24. //1.处理左右子树为空的情况
  25. if (root.left == null) {
  26. return root.right;
  27. }
  28. if (root.right == null) {
  29. return root.left;
  30. }
  31. //2.处理左右子树均不为空的情况
  32. //获取右子树中值最小的节点
  33. TreeNode minNode = getMinNode(root.right);
  34. //删除右子树中值最小的节点
  35. root.right = deleteNode(root.right, minNode.val);
  36. //用右子树中值最小的节点替换当前根节点
  37. minNode.left = root.left;
  38. minNode.right = root.right;
  39. root = minNode;
  40. } else if (root.val > key) {
  41. //要删除的节点可能在当前根节点的左子树中
  42. root.left = deleteNode(root.left, key);
  43. } else {
  44. //要删除的节点可能在当前根节点的右子树中
  45. root.right = deleteNode(root.right, key);
  46. }
  47. return root;
  48. }
  49. //获取当前二叉搜索树中值最小的节点
  50. public TreeNode getMinNode(TreeNode node) {
  51. //二叉搜索树中最左边的节点即为值最小的节点
  52. while (node.left != null) {
  53. node = node.left;
  54. }
  55. return node;
  56. }
  57. }

发表评论

表情:
评论列表 (有 0 条评论,131人围观)

还没有评论,来说两句吧...

相关阅读