代码随想录刷题Day22 | 235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点
235. 二叉搜索树的最近公共祖先
题目:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
思路:
二叉搜索树的最近公共祖先要比普通二叉树简单,因为二叉搜索树的中序遍历是有序的,因此第一个见到的在[p,q]之间的节点,一定是搜索二叉树的公共祖先。
代码:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val < p.val && root.val < q.val){
return lowestCommonAncestor(root.right, p, q);
}else if(root.val > p.val && root.val > q.val){
return lowestCommonAncestor(root.left, p, q);
}else{
return root;
}
}
}
701.二叉搜索树中的插入操作
题目:
给定二叉搜索树(BST)的根节点 root
和要插入树中的值 value
,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
思路:
按照搜索二叉树的规则遍历二叉树,直至找到一个空节点,插入当前节点。
代码:
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root == null) return new TreeNode(val);
if(root.val < val){
if(root.right != null){
insertIntoBST(root.right, val);
}else{
root.right = new TreeNode(val);
}
}else{
if(root.left != null){
insertIntoBST(root.left, val);
}else{
root.left = new TreeNode(val);
}
}
return root;
}
}
50.删除二叉搜索树中的节点
题目:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
思路:
二叉树搜索树的删除分好多种情况:
- 要删除的节点是叶子节点,直接删除即可
- 要删除的节点有一个孩子为空,返回不为空的哪一个孩子
- 言删除的节点两个孩子均不为空,让其右孩子的最左边的孩子来代替要删除的节点,然后其置为空
代码:
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root = delete(root,key);
return root;
}
private TreeNode delete(TreeNode root, int key) {
if (root == null) return null;
if (root.val > key) {
root.left = delete(root.left,key);
} else if (root.val < key) {
root.right = delete(root.right,key);
} else {
if (root.left == null) return root.right;
if (root.right == null) return root.left;
TreeNode tmp = root.right;
while (tmp.left != null) {
tmp = tmp.left;
}
root.val = tmp.val;
root.right = delete(root.right,tmp.val);
}
return root;
}
}