代码随想录 (programmercarl.com)
235. 二叉搜索树的最近公共祖先
701.二叉搜索树中的插入操作
只要遍历二叉搜索树,找到空节点 插入元素就可以了,那么这道题其实就简单了
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root == null){
TreeNode node = new TreeNode(val);
return node;
}
if (val < root.val){
root.left = insertIntoBST(root.left, val);
}
if (val > root.val){
root.right = insertIntoBST(root.right, val);
}
return root;
}
}
450.删除二叉搜索树中的节点
需要修改二叉搜索树的结构,难。
五种情况分析:
1.未找到需要删除的节点:不做处理
2.找到删除的节点:
2.1.需要删除的节点是叶子节点,左为空,右也为空:直接删除,不修改树的结构;
2.2.需要删除的节点左不为空,右为空:直接跳过中间需要删除的节点,让不为空的左节点指向删除节点原本指向的节点;
2.3.需要删除的节点左为空,右不为空:直接跳过中间需要删除的节点,同2.2操作;
2.4.需要删除的节点左不为空,右也不空:右子树继位--将需要删除的节点的左孩子放在右边孩子的最左侧的值(这个节点的值比需要删除节点大一点点),变为删除节点左为空右不为空的2.3情况;左子树继位类似。
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null){ //一直遍历未找到需要删除的节点
return null;
}
if (root.val == key){
if (root.left == null && root.right == null){
return null;
} else if (root.left != null && root.right == null) {
return root.left;
} else if (root.left == null && root.right != null){
return root.right;
} else if (root.left != null && root.right != null) {
TreeNode cur = root.right;
while (cur.left != null){
cur = cur.left;
}
cur.left = root.left;
return root.right;
}
}
//以上为终止条件
if(key < root.val){
root.left = deleteNode(root.left, key);
} else if (key > root.val) {
root.right = deleteNode(root.right, key);
}
return root;
}
}