235.二叉搜尋樹的最近公共祖先
題目連結 文章講解 影片講解
思路:遞迴遍歷二叉搜尋樹
如果當前值大於p和q的值,向左遍歷
如果當前值小於p和q的值,向右遍歷
否則說明當前值介於p和q之間,直接返回當前節點
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(left) return left;
}
if(root->val < p->val && root->val < q->val) {
TreeNode*right = lowestCommonAncestor(root->right, p, q);
if(right) return right;
}
return root;
}
};
701.二叉搜尋樹中的插入操作
題目連結 文章講解 影片講解
思路:遍歷至空節點插入即可
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root == nullptr) {
root = new TreeNode(val);
return root;
}
insert(root, val);
return root;
}
void insert(TreeNode* node, int val) {
// 當前節點大於插入值,向左遍歷
if(node->val > val) {
if(node->left) insertIntoBST(node->left, val);
else node->left = new TreeNode(val);
}
// 當前節點小於插入值,向右遍歷
if(node->val < val) {
if(node->right) insertIntoBST(node->right, val);
else node->right = new TreeNode(val);
}
return ;
}
};
450.刪除二叉搜尋樹中的節點
題目連結 文章講解 影片講解
難點:當待刪除的節點的左右子樹都不為空時:
將當前節點的左子樹掛載到右子樹的最左邊;
然後將當前指標指向當前節點的右子樹。
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
// 1.如果根節點為空,或者沒有找到key,直接返回nullptr
if(root == nullptr) return nullptr;
// 如果找到key
if(root->val == key) {
// 2.如果待刪除節點的左右孩子都為空,直接刪除節點返回nullptr
if(!root->left && !root->right) {
delete root;
return nullptr;
}
// 3.如果待刪除節點左孩子不為空,右孩子為空
else if(root->left && !root->right) {
TreeNode* tem = root->left;
delete root;
return tem;
}
// 4.如果待刪除節點的右孩子不空,左孩子為空
else if(!root->left && root->right) {
TreeNode* tem = root->right;
delete root;
return tem;
}
// 5.如果待刪除節點的左右孩子都不為空
else {
TreeNode* tem = root;
TreeNode* cur = root->right;
while(cur->left) cur = cur->left;
cur->left = root->left;
root = root->right;
delete tem;
return root;
}
}
if(root->val > key) {
root->left = deleteNode(root->left, key);
}
if(root->val < key) {
root->right = deleteNode(root->right, key);
}
return root;
}
};