235. 二叉搜索树的最近公共祖先
题目链接:力扣题目链接
思路:题目其实可以用“236. 二叉树的最近公共祖先”相同方法解决,但是因为是二叉搜索树,所以可以根据当前节点大小与pq的关系进行计算,只要当前节点一旦落入pq之间就是公共节点(设施一个规律)。所以递归迭代都可以解决。
701.二叉搜索树中的插入操作
题目链接:力扣题目链接
思路:只要知道新加入的节点是在之前的叶子节点之后加入即可,因为这样判断需要递归的方向和该方向的子节点为空就是要添加的地方。
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if (root == null) {
return new TreeNode(val);
}
// 递归插入到左子树或右子树
if (val < root.val) {
root.left = insertIntoBST(root.left, val);
} else {
root.right = insertIntoBST(root.right, val);
}
return root; // 返回更新后的树
}
}
450.删除二叉搜索树中的节点
题目链接:力扣题目链接
思路:要删除的节点有几种情况1节点下无子节点、2有左子节点、3有右子节点、4左右子节点都有、5没有找到节点。这些要分情况处理,只有一个子节点简单,只返回这个子节点就好,如果有左右两个子节点,就需要选择一个节点接入另一侧节点,比如左侧节点又要接入右侧子节点中的最左侧节点(右侧同理)。
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root = die(root,key);
return root;
}
public TreeNode die(TreeNode node, int key){
if(node==null){
return null;
}
if(node.val==key){
if(node.left==null&&node.right!=null){
return node.right;
}else if(node.left!=null&&node.right==null){
return node.left;
}else if(node.left==null&&node.right==null){
return null;
}else{
TreeNode current =node.right;
while(current.left!=null){
current =current.left;
}
current.left = node.left;
return node.right;
}
}else if(node.val>key){
node.left = die(node.left,key);
}else if(node.val<key){
node.right = die(node.right,key);
}
return node;
}
}class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root = die(root,key);
return root;
}
public TreeNode die(TreeNode node, int key){
if(node==null){
return null;
}
if(node.val==key){
if(node.left==null&&node.right!=null){
return node.right;
}else if(node.left!=null&&node.right==null){
return node.left;
}else if(node.left==null&&node.right==null){
return null;
}else{
TreeNode current =node.right;
while(current.left!=null){
current =current.left;
}
current.left = node.left;
return node.right;
}
}else if(node.val>key){
node.left = die(node.left,key);
}else if(node.val<key){
node.right = die(node.right,key);
}
return node;
}
}
时间:2h