力扣第18天----第235题、第701题、第450题
一、第235题–二叉搜索树的最近公共祖先
这道题,就是在一个二叉树中找节点。无所谓前序、中序、后序,这里就只用到了左右子树,没有用到根节点。左右子树、根节点数值比较下,从上往下找,一旦发现夹在了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 != nullptr) return left; // 返回值触发条件,找到了结果。
}
else if (root->val < p->val && root ->val < q->val){
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (right != nullptr) return right; // 返回值触发条件,找到了结果。
}
return root;
}
};
二、第701题–二叉搜索树中的插入操作
这里呢,也是不断地判断向左和向右,根据大小判断找到合适的位置,找到位置后新建一个TreeNode,并建立相应的链接。
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == nullptr) { //终止条件,遇到nullptr时,就新建一个TreeNode。
TreeNode* temp = new TreeNode(val);
return temp;
}
if (root->val > val){ //判断向左还是向右
TreeNode* left = insertIntoBST(root->left, val); //新建一个TreeNode
root->left = left; //建立相应的链接
}
if (root->val < val){ //判断向左还是向右
TreeNode* right = insertIntoBST(root->right, val); //新建一个TreeNode
root->right = right; //建立相应的链接
}
return root;
}
};
三、第450题–删除二叉搜索树中的节点
跟着答案做下来,感觉还行。跟上一题类似,根据key与root的大小关系,找对应的节点位置。找到节点位置,就触发终止条件。
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if (root == nullptr) return nullptr; //终止条件,nullptr时,返回nullptr。
if (root->val == key){ //终止条件,相等时,删除节点。
if (root->left == nullptr && root->right == nullptr) return nullptr; //叶子结点
if (root->left == nullptr && root->right != nullptr) return root->right; //一侧为空,返回不为空的那个节点
if (root->left != nullptr && root->right == nullptr) return root->left; //一侧为空,返回不为空的那个节点
if (root->left != nullptr && root->right != nullptr){ //都不为空,找到右侧最小值节点,通过指针把左侧全都转到右侧最小值节点。返回root->right节点。
TreeNode* cur = root->right;
while(cur->left) cur = cur->left;
cur->left = root->left;
return root->right;
}
} //下面是单层逻辑,key与root大小比较,向左和向右的判断。
if (key < root->val ){
TreeNode* left = deleteNode(root->left, key);
root->left = left;
}
if (key > root->val){
TreeNode* right = deleteNode(root->right, key);
root->right = right;
}
return root;
}
};