Git分布式版本控制--2+day018 LeetCode235 701 450

基础操作:

1.分支:

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能,以免影响开发主线。

2.指令操作:

2.1 查看本地分支: git branch
2.2 创建本地分支: git branch 分支名
2.3 切换分支: git checkout -b 分支名(创建并切换)

2.4 合并分支:

git merge 分支名称(将合并名称的分支合并到当前分支)

2.5 删除分支:

不能删除当前分支, 只能删除其他分支 git branch -d b1 删除分支时 要做各种检查

git branch -D b1 不做任何检查 强制删除

3.解决冲突:

当两个分支上对文件进行修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:

1.处理文件中冲突的地方
2.将解决完冲突的文件加入暂存区
3.提交到仓库

算法章节:

235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。"

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

相较于二叉树的公共祖先来说较为简单些,因为可以利用二叉搜索树的特性来解题,也就是说,如果当前节点大于p,q的节点的值,则向左遍历,如果小于,则向右遍历,并判断是否为空,若不为空,则代表找到了,返回left的值,下面代码逻辑同理,如果不大于也不小于,则就是等于,返回当前的值,该值就是p或q的值。

cpp 复制代码
class Solution {
public:
    TreeNode* travelRoot(TreeNode* root, TreeNode* p, TreeNode* q){
             if(root==nullptr){
                return nullptr;
            }
            if(root->val>p->val&&root->val>q->val){
                TreeNode* left=travelRoot(root->left,p,q);
                if(left!=nullptr){
                    return left;
                }
            }
              if(root->val<p->val&&root->val<q->val){
                TreeNode* right=travelRoot(root->right,p,q);
                if(right!=nullptr){
                    return right;
                }
            } 
            return root;
    }
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==nullptr){
            return nullptr;
        }
        TreeNode* node=travelRoot(root,p,q);
        return node;
    }
};

701.二叉树的插入操作:

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

思路:本题虽然被标记为中等难度,但并不难,可以根据二叉搜索树的性质,通过递归来做,当遍历的节点遇上空,返回要插入节点的值,即可满足条件。

cpp 复制代码
class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root==nullptr){
            return new TreeNode(val);
        }
        if(root->val>val){
             root->left=insertIntoBST(root->left,val);
        }
        if(root->val<val){
            root->right=insertIntoBST(root->right,val);
        }
        return root;
    }
};

450.删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为 O(h),h 为树的高度。

思路:本题目相较于上述题目有些难度,其难度在于要考虑多种条件,因为是二叉搜索树的删除操作,删除一个树上的节点可能有五种情况要考虑,1.当前值==删除节点的值,且左节点不为空并且右节点不为空,那么就将删除节点的左子树放到右子树的最左边节点的左孩子位置上。2.当左右都为空时,代表当前节点就是要删除的节点,因此直接返回空即可。3. 当左不为空右为空时,让根节点向左移动一位,并且返回移动后的根节点,4.当左为空右不为空时,让当前节点向右移动一位,并返回移动后的根节点。5.当遇到空节点时,返回nullptr。

cpp 复制代码
class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root==nullptr){//确定终止条件
            return nullptr;
        }
        if(root->val==key&&root->left==nullptr&&root->right==nullptr){
            return nullptr;
        }else if(root->val==key&&root->left!=nullptr&&root->right!=nullptr){
            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;
        }else if(root->val==key&&root->left==nullptr&&root->right!=nullptr){
            TreeNode* node=root;
            root=root->right;
            delete node;
            return root;
        }else if(root->val==key&&root->left!=nullptr&&root->right==nullptr){
            TreeNode* node=root;
            root=root->left;
            delete node;
            return root;
        }
        if(root->val>key){
            root->left=deleteNode(root->left,key);
        }
        if(root->val<key){
            root->right=deleteNode(root->right,key);
        }
        return root;
    }
};
相关推荐
HoneyMoose12 分钟前
执行 git svn clone --stdlayout 命令无输出
git·svn
HoneyMoose1 小时前
把 SVN 仓库转换为 Git 需要的 2 个命令
git·svn
历程里程碑11 小时前
4 Git远程协作:从零开始,玩转仓库关联与代码同步(带实操代码讲解)
大数据·c++·git·elasticsearch·搜索引擎·gitee·github
金銀銅鐵14 小时前
[git] 浅解 git reset 命令
git·后端
zhangfeng113314 小时前
部署到服务器上 宝塔系统 使用宝塔在线编辑器 FTP 批量上传 Git 部署 打包上传 codebudyy 编程程序开发
服务器·git·编辑器
学习是种信仰15 小时前
Git工作流
git·深度学习
yuanyuan2o217 小时前
Git merge 的几种不同模式
git·github
视觉小萌新17 小时前
关于Vscode配置企业Git
git
zh_xuan17 小时前
使用命令行把安装包上传到github
c++·git·libcurl·c++工程打包
zhangfeng113319 小时前
适合 5人以内小团队的Git 工作流 + Code Review + 自动化部署方案 FastAdmin +linunx服务器宝塔系统 外包项目 —
服务器·git·自动化·php·代码复审