代码随想录算法训练营第二十四天
235. 二叉搜索树的最近公共祖先
题目链接:235. 二叉搜索树的最近公共祖先
从根节点向下搜索,如果当前节点数值大于p和q证明需要在左子树范围内搜索;如果当前节点数值都小于p和q,需要在整个右子树中寻找,找到在p和q之间的节点,就是最近的公共祖先节点。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == nullptr)
return nullptr;
if (root->val > p->val && root->val > q->val) {
TreeNode* left = lowestCommonAncestor(root->left, p, q);
if(root->left!=nullptr)
return left;
}else if(root->val < p->val && root->val < q->val){
TreeNode* right = lowestCommonAncestor(root->right,p,q);
if(root->right!=nullptr)
return right;
}
return root;
}
};
701.二叉搜索树中的插入操作
题目链接:701.二叉搜索树中的插入操作
大了往左找,小了往右找,将要插入的节点放到最后的叶子节点,不用调整树的结构。
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == nullptr) {
TreeNode* new_node = new TreeNode(val);
return new_node;
}
if (root->val > val) {
root->left = insertIntoBST(root->left, val);
} else {
root->right = insertIntoBST(root->right, val);
}
return root;
}
};
450.删除二叉搜索树中的节点
题目链接:450.删除二叉搜索树中的节点
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==nullptr)return nullptr;
if(root->val>key){
root->left =deleteNode(root->left, key);
}else if (root->val<key){
root->right = deleteNode(root->right, key);
}else{
if(root->left==nullptr&&root->right ==nullptr){//如果要删除的子树是叶子节点,直接将空节点返回上层。
return nullptr;
}else if (root->left!=nullptr&&root->right == nullptr){//如果要删除的节点只有左孩子,就将左子节点返回上层。
return root->left;
}else if(root->left==nullptr&&root->right!=nullptr){//如果要删除的节点只有右孩子,就将有子节点返回上层。
return root->right;
}else{//如果要删除的子节点既有左孩子也有右孩子,将当前左子节点接到当前右子节点的左子树末尾,将当前子节点的右子树返回上层。
TreeNode* cur = root->right;
while(cur->left!=nullptr){
cur = cur->left;
}
cur->left = root->left;
return root->right;
}
}
return root;
}
};