30_删除二叉搜索树中的节点
1.01_设计一个有getMin功能的栈2.02_由两个栈组成的队列3.03_如何仅用递归函数和栈操作逆序一个栈4.04_猫狗队列5.05_用一个栈实现另一个栈的排序6.06_用栈来求解汉诺塔问题7.07_用队列实现栈8.09_删除字符串中的所有相邻重复项9.08_ 有效的括号10.10_逆波兰表达式求值11.11_滑动窗口最大值12.12_前K个高频元素13.01_移除链表元素14.02_设计链表15.03_反转链表16.04_两两交换链表中的节点17.05_删除链表的倒数第N个节点18.06_链表相交19.07_环形链表20.01_二叉树的递归遍历21.二叉树理论基础22.02_二叉树的迭代遍历23.04_二叉树的层序遍历24.05_二叉树的层次遍历II25.06_二叉树的右视图26.07_二叉树的层平均值27.08_N叉树的层序遍历28.09_每个行中找最大值29.10_填充每个节点的下一个右侧节点指针30.11_二叉树的最大深度31.12_二叉树的最小深度32.13_翻转二叉树33.14_对称二叉树34.15_完全二叉树的节点个数35.16_平衡二叉树36.17_二叉树的所有路径37.18_左叶子之和38.19_找树左下角的值39.20_路径总和40.21_从中序与后序遍历序列构造二叉树41.22_最大二叉树42.23_合并二叉树43.24_二叉搜索树中的搜索44.27_二叉搜索树的众数45.28_二叉树的最近公共祖先46.29_二叉搜索树中的插入操作
47.30_删除二叉搜索树中的节点
48.31_修剪二叉搜索树49.32_将有序数组转换为平衡二叉搜索树50.33_把二叉搜索树转换为累加树51.动态规划理论52.01_斐波那契数列53.02_爬楼梯54.03_使用最小花费爬楼梯55.04_不同路径56.05_不同路径2(带障碍物版)57.06_整数拆分58.08_杨辉三角59.10_最后一块石头的重量60.09_分割等和子集61.74_搜索二维矩阵450.删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 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
输出: []
递归法
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
//当前节点不存在,找不到key,直接返回null
if (root == null)
return null;
if (root.val == key) { //找到了待删除的节点的值
//情形一:待删除节点的左右孩子都为null,这一层直接返回null
if (root.left == null && root.right == null) {
return null;
//情形二:待删除节点的左孩子不为null,右孩子为null,这一层直接返回root.left
} else if (root.left != null && root.right ==null) {
return root.left;
//情形三:待删除节点的左孩子为null,右孩子不为null,这一层直接返回root.right
} else if (root.left == null && root.right != null) {
return root.right;
} else {
//情形四:待删除节点的左右孩子都不为空,让右孩子作为新的根节点,让右孩子的最左下的节点指向root.left(待删除节点的左子树)
TreeNode cur = root.right;
while (cur.left != null) {
cur = cur.left;
}
cur.left = root.left;
//这里是返回原来待删除节点的右孩子节点,而不是cur,cur在遍历过程中已经变了
return root.right;
}
}
if (root.val < key) root.right = deleteNode(root.right, key);
if (root.val > key) root.left = deleteNode(root.left, key);
return root;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人