今朝剑指叠云处,爱蛊爱人还爱天
Leetcode 235. 二叉搜索树的最近公共祖先
thought:
二叉搜索树的特性
k神向下找思路,当p,q都在当前root的右子树时,则遍历至root->right
当 p,q 都在 root的 左子树 中,则遍历至 root->left
否则找到了最近公共祖先,跳出
完整C++代码如下:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while (root != nullptr) {
if (root->val < p->val && root->val < q->val) // p,q 都在 root 的右子树中
root = root->right; // 遍历至右子节点
else if (root->val > p->val && root->val > q->val) // p,q 都在 root 的左子树中
root = root->left; // 遍历至左子节点
else break;
}
return root;
}
};
Leetcode 701. 二叉搜索树中的插入操作
thought:
- 直接向下找法,思路很直观,迭代法
完整C++代码如下:
//v1
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(!root)return new TreeNode(val);
TreeNode* root1=root;
while(1){
if(root->val>val){
if(root->left){
root=root->left;
}else{
root->left=new TreeNode(val);
break;
}
}
else{
if(root->right){
root=root->right;
}else{
root->right=new TreeNode(val);
break;
}
}
}
return root1;
}
};
Leetcode 450. 删除二叉搜索树中的节点
thought:
-
首先进行的操作是对当前节点进行判断和检查,一共是五种情况,如下代码
-
之后对左右进行递归,注意递归时用到了二叉搜索树的特性,left smaller and right larger
else if (root->val > key) root->left = deleteNode(root->left, key); else root->right = deleteNode(root->right, key);
-
结束
删除节点的左右孩子均不空这种情况,把左孩子塞到右孩子最左下角,右孩子跑到删除节点位置即可
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(!root)return NULL;//1.查无此值
if (root->val == key) {
if(!root->left&&!root->right){//2.两个孩子都为空
delete root;
return NULL;
}
else if(!root->left){//3.左空右不空
TreeNode* rightNode = root->right;
delete root;
return rightNode;
}else if(!root->right){//4.右空左不空
TreeNode* leftNode = root->left;
delete root;
return leftNode;
}else{//5.左右均不空
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;
}
};