235.二叉搜索树的最近公共祖先
本题我用的普通二叉树的最近公共祖先求法,二叉搜索树的专用求法先挖个坑后面再看卡哥视频补
701.二叉搜索树中的插入操作
用中序遍历比较树中结点与待插入结点的值大小,如果当前结点大于待插入结点则向左子树递归,否则向右子树递归,当处理到叶子结点时才执行插入操作
class Solution {
public://中序
void traversal(TreeNode*root,int val){
if(root== nullptr)return;
if(root->val>val)
insertIntoBST(root->left,val);
if(root->left== nullptr&&root->val>val){
TreeNode*tmp=new TreeNode(val);
root->left=tmp;
}
if(root->right== nullptr&&root->val<val){
TreeNode*tmp=new TreeNode(val);
root->right=tmp;
}
if(root->val<val)
insertIntoBST(root->right,val);
}
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root== nullptr){
root=new TreeNode(val);
}
traversal(root,val);
return root;
}
};
450.删除二叉搜索树中的节点
删除结点需要考虑多种情况
- 删除结点是叶子结点:直接删
- 删除结点的左子树为空:用右子树代替它
- 删除结点的右子树为空:用左子树代替它
- 删除结点的左右子树都不为空:调整删除后树的结构,将结点的左子树挂载到右子树的最左边
- 没找到要删除的结点:返回
对于左右子树都不为空的情况,可以用右子树代替被删除结点的位置,由于还需要保证该树为二叉搜索树所以将左子树挂载到右子树的最左边,如下图所示