代码随想录算法训练营
- 代码随想录算法训练营43期
- 235.二叉搜索树的最近公共祖先
- 701.二叉搜索树中的插入操作
- 450.删除二叉搜索树中的节点
代码随想录算法训练营43期
235.二叉搜索树的最近公共祖先
解题思路:
二叉搜索树一定是有序的
判断条件:
cur>p && cur>q,则可推出,公共祖先在左子树;
cur<p && cur<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:
// 1. 确定递归函数的参数
TreeNode* traversal(TreeNode* cur, TreeNode*p, TreeNode* q)
{
// 2 确定递归函数的终止条件
if(cur==NULL) return cur;
//3 确定单层递归的顺序
if(cur->val > p->val && cur->val > q->val)
{
// 公共祖先在左子树中
TreeNode* left = traversal(cur->left, p, q);
if(left!=NULL)
return left;
}
// 右子树
if(cur->val < p->val && cur->val < q->val)
{
TreeNode* right = traversal(cur->right, p, q);
if(right!=NULL)
return right;
}
return cur;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return traversal(root, p, q);
}
};
701.二叉搜索树中的插入操作
解题思路:
在叶子结点上插入我们新添加的元素
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == NULL) {
TreeNode* node = new TreeNode(val);
// 返回上一层
return node;
}
if (root->val > val) root->left = insertIntoBST(root->left, val);
if (root->val < val) root->right = insertIntoBST(root->right, val);
return root;
}
};
450.删除二叉搜索树中的节点
二叉搜索树的删除操作,涉及到改变树的结构
- 确定递归函数的参数以及返回值
TreeNode* deleteNode(TreeNode* root, int key)- 确定终止条件
- 确定单层递归的逻辑
二叉搜索树删除节点遇到的五种情况:
- 没找到删除的节点,返回
- 找到删除的节点
- 左右孩子节点都为空,直接删除节点
- 删除节点左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
- 删除节点右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
- 左右孩子都不为空,删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
// 终止条件 没有找到该节点
if(root==nullptr) return root;
// 找到节点
if(root->val == key)
{
if(root->left==nullptr&&root->right==nullptr)
{
delete root;
return nullptr;
}
else if(root->right==nullptr)
{
TreeNode* rNode = root->left;
delete root;
return rNode;
}
else if(root->left==nullptr)
{
TreeNode* lNode = root->right;
delete root;
return lNode;
}
// 第五种情况
else
{
TreeNode* cur = root->right;
while(cur->left!=nullptr)
{
cur=cur->left;
}
cur->left = root->left;
TreeNode* temp = root;
root = root->right;
delete temp;
return root;
}
}
if(root->val>key) root->left = deleteNode(root->left, key);
if(root->val<key) root->right = deleteNode(root->right, key);
return root;
}
};