231010刷题记录
参考代码代码随想录来刷的
关键词:二叉树、二叉搜索树的插入和删除
1 701.二叉搜索树中的插入操作
力扣题目链接
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
这题有一个思路比较简单,必定能够在叶子处插入。
public class Solution2 {
public TreeNode insertIntoBST(TreeNode root, int val) {
if (root == null)
return new TreeNode(val);
if (val > root.val)
root.right = insertIntoBST(root.right, val);
else
root.left = insertIntoBST(root.left, val);
return root;
}
}
2 450.删除二叉搜索树中的节点
力扣题目链接
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
这道题的思路比较困难,有点复杂,编程不太难。
有以下五种情况:
-
第一种情况:没找到删除的节点,遍历到空节点直接返回了
-
第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
-
第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
-
第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
-
第五种情况:左右孩子节点都不为空,左子树、右子树补位都行。
以右子树补位为例,左子树中所有结点值都小于右子树的,那么应该将左子树插入到右子树最左下角。因为一旦在一个结点往右,那么表示大于该节点的值。
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null)
// 1 树中不存在key
return root;
if (key > root.val) {
root.right = deleteNode(root.right, key);
return root;
} else if (key < root.val) {
root.left = deleteNode(root.left, key);
return root;
} else {
if (root.left == null && root.right == null)
// 2 要删除结点的左右子树都为空
return null;
else if (root.left == null)
// 3 要删除结点的左子树为空,右子树不为空
return root.right;
else if (root.right == null)
// 4 要删除结点的右子树为空,左子树不为空
return root.left;
else {
// 5 要删除结点的左右子树都存在
// 右子树去代替,并将左子树移动到右子树左下角去。
TreeNode cur = root.right;
while (cur.left != null)
cur = cur.left;
cur.left = root.left;
return root.right;
}
}
}
}