代码编织梦想

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

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

struct TreeNode* traversal(struct TreeNode* cur,struct TreeNode* p,struct  TreeNode* q) {
        if (cur == NULL) return cur;

        if (cur->val > p->val && cur->val > q->val) {   
            struct TreeNode* left = traversal(cur->left, p, q);
            if (left != NULL) {
                return left;
            }
        }

        if (cur->val < p->val && cur->val < q->val) {   
            struct TreeNode* right = traversal(cur->right, p, q);
            if (right != NULL) {
                return right;
            }
        }
        return cur;
    }
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
    return traversal(root,p,q);
}

根据二叉搜查树的特点,我们可以将情况分成三种,第一种是两个值在分别在左右子树上,第二和三情况是两个值都在左子树或者右子树上

为什么只需要处理第二三种情况

——因为不满足这两种情况的话,那一定就属于第一情况,题目中说到一个结点也是它本身的公共祖先

701. 二叉搜索树中的插入操作

struct TreeNode* createTreeNode(int val) {
    struct TreeNode* ret = malloc(sizeof(struct TreeNode));
    ret->val = val;
    ret->left = ret->right = NULL;
    return ret;
}

struct TreeNode* insertIntoBST(struct TreeNode* root, int val) {
    if (root == NULL) {
        root = createTreeNode(val);
        return root;
    }
    struct TreeNode* pos = root;
    while (pos != NULL) {
        if (val < pos->val) {
            if (pos->left == NULL) {
                pos->left = createTreeNode(val);
                break;
            } else {
                pos = pos->left;
            }
        } else {
            if (pos->right == NULL) {
                pos->right = createTreeNode(val);
                break;
            } else {
                pos = pos->right;
            }
        }
    }
    return root;
}

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

struct TreeNode* deleteNode(struct TreeNode* root, int key){
    if (root == NULL) {
        return NULL;
    }
    if (root->val > key) {
        root->left = deleteNode(root->left, key);
        return root;
    }
    if (root->val < key) {
        root->right = deleteNode(root->right, key);
        return root;
    }
    if (root->val == key) {
        if (!root->left && !root->right) {
            return NULL;
        }
        if (!root->right) {
            return root->left;
        }
        if (!root->left) {
            return root->right;
        }
        struct TreeNode *successor = root->right;
        while (successor->left) {
            successor = successor->left;
        }
        root->right = deleteNode(root->right, successor->val);
        successor->right = root->right;
        successor->left = root->left;
        return successor;
    }
    return root;
}

有五种情况第一种为空树,第二种为树叶结点,第三四种,其中一个子结点为空,第五种左右结点都不为空

如果为空树和树叶结点的话,那么直接返回空

如果其中一个子结点为空的话,那么返回他的结点

如果左右不为空,那么找要被删除结点的右子结点的最左子结点,然后将删除的左子结点放到最左子结点的左节点。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MptRe/article/details/136745069

代码随想录day22|235. 二叉搜索树的最近公共祖先| 701.二叉搜索树中的插入操作|450.删除二叉搜索树中的节点|golang_扣1送肥猫的博客-爱代码爱编程

代码随想录day22 活着就很好呀  目录 前置知识:二叉搜索树 查找操作 插入操作 删除操作 235. 二叉搜索树的最近公共祖先 701、二叉搜索树中的插入操作 450、删除二叉搜索树 前置知识:二叉搜索树         要学二叉搜索树,那首先什么是二叉搜索树? 二叉搜索树,又叫二叉排序树或二叉查找树。         见名知

代码随想录day22|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中节点_囿丫七的博客-爱代码爱编程

文章目录 235.二叉搜索树的最近公共祖先701.二叉搜索树中的插入操作450.删除二叉搜索树中节点 235.二叉搜索树的最近公共祖先 文章讲解:代码随想录 (programmercarl.com) 题目链

代码随想录day22|235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点-爱代码爱编程

235.二叉搜索树的最近公共祖先 题目链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/ 输入: ro

代码随想录刷题day22 | 235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点-爱代码爱编程

代码随想录刷题Day22 | 235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点 235. 二叉搜索树的最近公共祖先 题目: 给定一个二叉搜索树, 找到该树中两个

代码随想录算法训练营day22 | 235. 二叉搜索树的最近公共祖先 | 701. 二叉搜索树中的插入操作 | 450. 删除二叉搜索树中的节点-爱代码爱编程

文章目录 235. 二叉搜索树的最近公共祖先701. 二叉搜索树中的插入操作450. 删除二叉搜索树中的节点重构删除迭代删除 返回值是非常有效的传递信息的方式!尤其在二叉树的修改中,返回值

jar包增量更新分析-爱代码爱编程

jdk自带工具jdeps,可分析class依赖关系(依赖的其它类和jar)。 团队,可以在此工具结果的基础上再详细分析对比出增量文件; 思路如下: jdeps分别分析出旧包和新包的文件依赖关系。并对比出新增的文件列表、删

java数据结构与算法(验证二叉搜索树)-爱代码爱编程

前言 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 实现原理 将验证二叉搜索树计算同样可以转换为相同子问题,所以比较适合用递归。 1.递归的退出条件: 节点返回空为ture,节点的值不在对应数据大小范围内返回false。 2.递归方程: ch

c++ 11-爱代码爱编程

右值引用 右值引用和左值引用的区别 为了理解它们之间的区别,首先需要明白什么是左值(lvalue)和右值(rvalue)。 左值(Lvalue)和右值(Rvalue): 左值(Lvalue):通常指的是一个持久性的对象,它拥有一个明确的地址可以被取得。左值可以出现在赋值操作符的左边。例如,变量、数组的元素、对对象成员的引用等都是左值。右值(Rval

kubernetes 审计日志采集与分析最佳实践-爱代码爱编程

Kubernetes 审计日志概述 Kubernetes 在 1.7 版本中发布了审计(Audit)日志功能,审计(Audit)提供了安全相关的时序操作记录(包括时间、来源、操作结果、发起操作的用户、操作的资源以及请求/响应的详细信息等),通过审计日志,我们能够非常清晰的知道 K8S 集群到底发生了什么事情,包括但不限于: 当前/历史上集群发生了哪些变

代码随想录day22 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点-爱代码爱编程

代码随想录Day22 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点普通二叉树的删除

代码随想录day22|235. 二叉搜索树的最近公共祖先、 701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点-爱代码爱编程

leetcode235. 二叉搜索树的最近公共祖先 注意:√ 昨天在解决二叉树LCA问题的时候看到了Labuladong书中的内容,让这题变得简单,核心是要处理一个find(root, val1, val2)的问题注意一

代码随想录day22| 235. 二叉搜索树的最近公共祖先、 701.二叉搜索树中的插入操作、 450.删除二叉搜索树中的节点-爱代码爱编程

235. 二叉搜索树的最近公共祖先 在二叉树:公共祖先问题 (opens new window)中,如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树。 搜索一条边的写法: if (递归函数(root->

代码随想录算法随想录day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点-爱代码爱编程

目录 二叉搜索树的最近公共祖先思路解题方法复杂度Code 二叉搜索树中的插入操作思路解题方法复杂度Code 删除二叉搜索树中的节点思路解题方法复杂度Code 总结 二叉搜索树的最近公