235. 二叉搜索树的最近公共祖先
class Solution {
public:
TreeNode* traversal(TreeNode* cur, TreeNode* p, TreeNode* q){
if (cur==nullptr) return cur;//只是排除空树的情况,本问题不会运行到叶子节点的子节点。
if (cur->val>p->val && cur->val>q->val){
TreeNode* left = traversal(cur->left, p, q);
if (left!=nullptr) return left;
}
if (cur->val<p->val && cur->val<q->val){
TreeNode* right = traversal(cur->right, p, q);
if (right!=nullptr) return right;
}
return cur;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return traversal(root, p, q);
}
};
701.二叉搜索树中的插入操作
class Solution {
public:
TreeNode* insert(TreeNode* cur, int val){
if (cur==nullptr) {
TreeNode* node = new TreeNode(val);
return node;
}
if (cur->val > val){
cur->left = insert(cur->left, val);
}
if (cur->val < val){
cur->right = insert(cur->right, val);
}
return cur; //如果cur!=nullptr则无事发生,cur->left/right 依旧等于原节点
}
TreeNode* insertIntoBST(TreeNode* root, int val) {
return insert(root, val);
}
};
450.删除二叉搜索树中的节点
左不为空且右不为空时,可以将需要删除节点的左/右孩子任一个替代当前节点。如果将右孩子替代当前节点,就将原左子树放在原右孩子的最左下角的节点位置。因为这个位置是小于整个原右子树的位置,符合二叉搜索树的特性,之后删除当前节点,将当前节点的父节点直接与原右孩子相连接。
class Solution {
public:
//五种情况分别是
//1 没找到当前节点
//2 当前节点为叶子节点,即左空右空
//3 当前节点左空右不空
//4 当前节点右空左不空
//5 当前节点左右均不空
TreeNode* delete1(TreeNode* root, int key){
//在终止条件中处理节点
if (root==nullptr) return nullptr;// 处理1空树 2没找到
if (root->val==key){ //找到了
if (root->left==nullptr && root->right==nullptr) {
delete root;
return nullptr; //返回null相当于传递给父节点null,即删除了当前节点。
}
else if (root->left==nullptr && root->right != nullptr){
auto saveNode = root->right;
delete root;
return saveNode;
}
else if (root->left!=nullptr && root->right == nullptr){
auto saveNode = root->left;
delete root;
return saveNode;
}
else{
TreeNode* cur=root->right; //让右孩子替代当前位置
while (cur->left != nullptr){
cur=cur->left;//找到右孩子为根节点的子树中的最小节点位置
}
cur->left = root->left;
auto deleteNode = root;
root = root->right;
delete deleteNode;
return root; //删除当前节点
}
}
//递归逻辑
if (root->val>key) {
root->left = delete1(root->left, key);
}
if (root->val<key) {
root->right = delete1(root->right, key);
}
return root;
}
TreeNode* deleteNode(TreeNode* root, int key) {
return delete1(root, key);
}
};