235. 二叉搜索树的最近公共祖先
补充:
思路:
- 利用二叉搜索树的性质, 不需要全部遍历, 只搜索一条边即可
- node->val 一定在 p->val 和 q->val 之间, 且一定是最近公共祖先
- 若 q=25, p=35 则 40 不满足在 p,q 之间, 而 30 满足
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) return root;
if (root->val <= p->val && root->val >= q->val) return root;
//等价于只遍历一边
TreeNode* res = nullptr;
if (root->val > p->val && root->val > p->val) {
res = lowestCommonAncestor(root->left, p, q);
} else if (root->val < p->val && root->val < p->val) {
res = lowestCommonAncestor(root->right, p, q);
}
return res;
}
};
701.二叉搜索树中的插入操作
思路:
- 二叉搜索树不需要全部遍历
- 不需要调整二叉树, 直接寻找位置插入该节点即可
- 不需要遍历整个子树
//无返回值写法
class Solution {
public:
TreeNode* pre = nullptr;
void myoperator(TreeNode* node, int val) {
if (node == nullptr) { //一定要在节点为空时插入, 会出现不为叶子节点的情况
if (pre->val > val) {
pre->left = new TreeNode(val);
} else {
pre->right = new TreeNode(val);
}
return;
}
pre = node;
if (node->val > val) {
myoperator(node->left, val);
} else if (node->val < val) {
myoperator(node->right, val);
}
}
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == nullptr)
return new TreeNode(val);
myoperator(root, val);
return root;
}
};
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);
if (root->val < key)
root->right = deleteNode(root->right, key);
if (root->val == key) {
if (root->left == nullptr && root->right == nullptr)
return nullptr;
else if (root->left == nullptr && root->right != nullptr) {
return root->right;
} else if (root->left != nullptr && root->right == nullptr) {
return root->left;
} else {
TreeNode* tem = root->right;
while (tem->left != nullptr) {
tem = tem->left;
}
tem->left = root->left;
return root->right;
}
}
return root;
}
};