首页 > 编程语言 >算法随想Day20【二叉树】| LC235-二叉搜索树的最近公共祖先、LC701-二叉搜索树中的插入操作、LC450-删除二叉搜索树中的节点

算法随想Day20【二叉树】| LC235-二叉搜索树的最近公共祖先、LC701-二叉搜索树中的插入操作、LC450-删除二叉搜索树中的节点

时间:2023-02-22 12:13:46浏览次数:31  
标签:TreeNode val root nullptr 二叉 搜索 树中 节点 left

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

利用二叉搜索树的特性,中序遍历,如果当前节点的值大于q和p的值,公共祖先一定在当前节点的左子树中,同理小于q和p值时,公共祖先一定在当前节点的右子树。一旦找到介于p和q之间值的节点,则一定是最近公共祖先

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
    TreeNode* result = nullptr;
    if (root == nullptr)
    {
        return nullptr;
    }
    if (root->val >= p->val && root->val <= q->val || root->val <= p->val && root->val >= q->val)
    {
        result = root; 
    }
    if (root->val < p->val && root->val < q->val)
    {
        result = lowestCommonAncestor(root->right, p, q);
    }
    if (root->val > p->val && root->val > q->val)
    {
        result = lowestCommonAncestor(root->left, p, q);
    }
    return result;
}

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

不难,直接贴代码

TreeNode* insertIntoBST(TreeNode* root, int val)
{
    TreeNode* newNode = new TreeNode(val);
    TreeNode* curr = nullptr;
    TreeNode* prev = nullptr;
    if (root == nullptr)
    {
        root = newNode;
        return root;
    }
    curr = root;
    while (curr != nullptr)
    {
        prev = curr;
        if (curr->val > val)
            curr = curr->left;
        else if (curr->val < val)
            curr = curr->right; 
    }
    if (prev->val > val)
        prev->left = newNode;
    else if (prev->val < val)
        prev->right = newNode;

    return root;
}

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

听了Carl哥的分析,自己做一遍:

利用二叉搜索树的特性,进行中序遍历直到找到要删除的节点。若找到相应节点,分5种情况处理:

  • 没找到删除的节点,遍历到空节点直接返回了
  • 左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
  • 删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
  • 删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
  • 左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
TreeNode* deleteNode(TreeNode* root, int key)
{
    TreeNode* temp = nullptr;
    if (root == nullptr)
    {
        return nullptr;
    }
    if (root->val == key)
    {
        if (root->left == nullptr && root->right == nullptr)
        {
            return nullptr;
        }
        if (root->left == nullptr && root->right != nullptr)
        {
            temp = root->right;
            delete root;
            return temp;
        }
        if (root->left != nullptr && root->right == nullptr)
        {
            temp = root->left;
            delete root;
            return temp;
        }
        if (root->left != nullptr && root->right != nullptr)
        {
            temp = root->right;
            ////让temp指向当前要删除节点的右子树中的最左节点
            while (temp->left != nullptr)
            {
                temp = temp->left;
            }
            temp->left = root->left;
            temp = root->right;
            delete root;
            return temp;
        }
    }

    if(root->val > key)
        root->left = deleteNode(root->left, key);
    if(root->val < key)
        root->right = deleteNode(root->right, key);
    return root;
}

标签:TreeNode,val,root,nullptr,二叉,搜索,树中,节点,left
From: https://www.cnblogs.com/Mingzijiang/p/17143895.html

相关文章

  • 算法19:LeetCode_二叉树序列化与反序列化(层序)
    ​ 本题为链接为https://leetcode.cn/problems/serialize-and-deserialize-binary-tree想要搞懂本题,请先阅读我之前写的关于二叉树层序遍历文章算法8:LeetCode_二叉树的......
  • 算法20:求二叉树最宽的层有多少个节点(层序遍历续)
    ​ 之前我们已经实现了二叉树的层序遍历算法8:LeetCode_二叉树的层序遍历_chen_yao_kerr的博客-CSDN博客和二叉树的序列化与反序列化算法19:LeetCode_二叉树序列化与反序......
  • 【LeetCode二叉树#03】翻转二叉树的几种方法
    翻转二叉树力扣题目链接(opensnewwindow)翻转一棵二叉树。这道题目背后有一个让程序员心酸的故事,听说Homebrew的作者MaxHowell,就是因为没在白板上写出翻转二叉树,最......
  • 二叉树的数学性质
    二叉树的性质由于二叉树结构特殊,我们可以总结出以下的五个性质:   性质一:对于一棵二叉树,第i层的最大结点数量为2i−1个,比如二叉树的第一层只有一个根结点,也就是20=......
  • 力扣538 把二叉搜索树转换为累加树
    题目:给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(GreaterSumTree),使每个节点node的新值等于原树中大于或等于node.val的值之和。提醒一下,二叉......
  • 代码随想录算法训练营Day21 二叉树
    代码随想录算法训练营代码随想录算法训练营Day21二叉树|530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236.二叉树的最近公共祖先530.二叉搜索树的最小绝对差......
  • leetcode 99. 恢复二叉搜索树
    中序遍历,弄在数组里面,再弄个数组复制一份排好序比较哪里错了,换回来中序遍历的时候用map存一下数字的地址(默认没有重复元素)classSolution{public:vector<int>zh......
  • leetcode 105. 从前序与中序遍历序列构造二叉树
    递归,在中序中找前序的第一个元素,之后切割成两个相同子问题classSolution{public:TreeNode*buildTree(vector<int>&preorder,vector<int>&inorder){if(......
  • 代码随想录算法训练营第十六天 lc104.二叉树的最大深度 | lc111.二叉树的最小深度 | l
    lc104二叉树的最大深度首先需要知道深度与高度的区别,对于一个二叉树中的节点深度:根节点到该节点的距离高度:该节点到最底层叶节点的距离而求最大深度无异于求根节点......
  • 力扣108 将有序数组转换为二叉搜索树
    题目:给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值......