代码随想录算法训练营第22天 | 450. 删除二叉搜索树中的节点,701. 二叉搜索树中的插入操作,235. 二叉搜索树的最近公共祖先
235. 二叉搜索树的最近公共祖先
- return left return right 可以理解为向上传递下面的结果 可能为null 可能为结果 因为这是有返回值的
- 只要root遍历到 p和q一个在左 一个在右 那该root就是最小公共祖先
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null) return null;
if(p.val<root.val && q.val<root.val){
TreeNode left = lowestCommonAncestor(root.left,p,q);
if(left!=null) return left;
}
if(p.val>root.val && q.val>root.val){
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(right!=null) return right;
}
return root;
}
}
701. 二叉搜索树中的插入操作
- 不用被题目误导重新构造二叉树 最简单的操作就是 遍历到叶节点 然后添加新节点
- 如何插入新节点 在叶节点处创建新节点后 返回该节点向上 然后遍历时 用root.left/root.right 来接
- 最后返回根节点root
- 审题很重要
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. 删除二叉搜索树中的节点
- 有5种情况 每种对二叉树 的操作不同
- 没找到目标节点 return null
- 目标节点为叶节点 return null
- 目标节点 有左子树 无右子树 return root.left
- 目标节点 有右子树 无左子树 return root.right
- 目标节点 有左右子树 将左子树添加到作为右子树的最左端节点的左子树 然后return root.right 可以用一个指针一直root.left过去
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.right!=null && root.left==null){
return root.right;
}else{
TreeNode cur = root.right;
while(cur.left!=null){
cur = cur.left;
}
cur.left = root.left;
return root.right;
}
}
if(root.val>key) root.left = deleteNode(root.left,key);
if(root.val<key) root.right = deleteNode(root.right,key);
return root;
}
}