代码随想录算法训练营
- 代码随想录算法训练营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;}
};