235.二叉搜索树的最近公共祖先
思路:根据二叉搜索树的特性,我们只需要判断当前节点是否在[p,q]范围内就可以,如果在这个范围里,说明当前节点就是其最近公共祖先。
class Solution {
// 根据二叉搜索树特性,只要当前节点在[p,q]范围内就说明是其最近祖先
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
return root;
}
}
701.二叉搜索树中的插入操作
思路:我们只需要根据二叉搜索树的特性,找到新节点可以插入的叶子节点的位置,将其插入到二叉搜索树的最下面即可。
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
TreeNode newNode = new TreeNode(val);
if (root == null) return newNode;
TreeNode i = root;
TreeNode temp = i;
while (i != null) {
temp = i;
if (i.val > val) {
i = i.left;
} else if (i.val < val) {
i = i.right;
}
}
if (temp.val > val) {
temp.left = newNode;
} else {
temp.right = newNode;
}
return root;
}
}
450.删除二叉搜索树中的节点
思路:删除二叉搜索树节点时,我们需要注意的五种情况,1、遍历到叶子节点仍然没有找到要删除的节点,返回null。2、要删除节点的左右子树均为null,直接返回null。3、要删除节点的左子树为null,直接返回右孩子。4、要删除的节点的右子树为null,直接返回左孩子。5、要删除的节点左右子树都不为null,将中序遍历过程中的下一个节点值放到当前位置,再将其删除即可。(注意:本题递归确定返回类型为节点类型,因为需要将删除节点后的子树根节点返回。)
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) return null; // 1、到叶子节点仍然没有找到要删除的节点,返回null
if (root.val > key) { // 当前节点大于key,从左子树中删除。
root.left = deleteNode(root.left, key);
} else if (root.val < key) { // 当前节点小于key,从右子树中删除
root.right = deleteNode(root.right, key);
} else {
// 当前节点就时要删除的节点
if (root.left == null) return root.right; // 2、左子树为空,直接返回右子树
if (root.right == null) return root.left; // 3、右子树为空,直接返回左子树,4、这里若左右子树均为空,也时返回空
// 5、左右子树都不为空
TreeNode temp = root.right;
while (temp.left != null) { // 找到中序的下一个节点
temp = temp.left;
}
root.val = temp.val;
root.right = deleteNode(root.right, temp.val); // 删除中序的下一个节点。
}
return root;
}
}