235 二叉搜索树的最近公共祖先
题目链接:二叉搜索树的最近公共祖先
思路
因为二叉搜索树是有序的,因此p
和q
的最近公共祖先一定在两者之间,所以每到一个节点,该节点的数值如果大于p
和q
,则朝左子树走;如果小于p
和q
,则朝右子树走;如果在两者之间,则返回该节点。
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 二叉搜索树中的插入操作
题目链接:二叉搜索树中的插入操作
思路
这道题目思路比较清晰,将val
与每个节点的值进行比较,大了朝右,小了朝左。最终总可以找到一个叶子节点存放这个val
。
class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(root == nullptr){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 删除二叉搜索树中的节点
题目链接:删除二叉搜索树中的节点
思路
删除二叉搜搜树种的节点有五种情况:
- 没有找到删除的节点
- 删除的节点是叶子节点,左右都为空
- 左为空,右不为空
- 左不为空,右为空
- 左右都不为空
情况2:直接删除叶子节点即可;情况3:让父节点指向它的右子树;情况4:让父节点指向它的左子树;情况5:让父节点指向它的右子树,同时将它的左子树移动到右子树下。
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->left == nullptr){TreeNode* node = root->right;delete root;return node;}else if(root->right == nullptr){TreeNode* node = root->left;delete root;return node;}else{TreeNode* cur = root->right;while(cur->left != nullptr){cur = cur->left;}cur->left = root->left;TreeNode* tmp = root;root = root->right;delete tmp;return root;}}if(root->val > key) {root->left = deleteNode(root->left, key);}if(root->val < key){root->right = deleteNode(root->right, key);}return root;}
};
参考链接
- https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#%E6%80%9D%E8%B7%AF