首页 > 其他分享 >Day17 二叉树part07| LeetCode 235. 二叉搜索树的最近公共祖先 ,701.二叉搜索树中的插入操作 ,450.删除二叉搜索树中的节点

Day17 二叉树part07| LeetCode 235. 二叉搜索树的最近公共祖先 ,701.二叉搜索树中的插入操作 ,450.删除二叉搜索树中的节点

时间:2024-09-16 22:46:10浏览次数:1  
标签:val root 二叉 搜索 null 树中 节点 left

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

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

  • 利用二叉搜索树的特性——有序树,可知,
    • 如果中间节点是p和q的公共节点,那个中间节点的数值一定在[p,q]区间
    • 因此,从根节点往下搜索,遇到的第一个位于[p,q]或[q,p]区间的节点就是最近公共祖先
class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
        {

        if(root==null) return null;
        if(root.val>p.val&&root.val>q.val)//左
        {
            TreeNode left=lowestCommonAncestor(root.left,p,q);
           if(left!=null) return left;
        }
        //右
            if(root.val<p.val&&root.val<q.val)
         {
            TreeNode right=lowestCommonAncestor(root.right,p,q);
            if(right!=null)
                return right;
            }

            //中
            return root;

        }
    }

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

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

  class Solution {

        public TreeNode insertIntoBST(TreeNode root, int val) {
               if(root==null)
               {
                   TreeNode node=new TreeNode(val);
                   return node;
               }
               if(root.val>val)
               {
                   root.left=insertIntoBST(root.left,val);
               }
               if(root.val<val)
               {
                   root.right=insertIntoBST(root.right,val);
               }
               
               return root;
        }
    }

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

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

  • 删除情况:

    1. 没找到删除的节点

    2. 删除的节点的左右子树都为空(叶子节点)

    3. 删除节点的左子树为空,右子树不为空

    4. 节点的右子树为空,左子树不为空

    5. 删除节点的左右子树都不为空

 class Solution {
        public TreeNode deleteNode(TreeNode root, int key) {

            /*终止条件*/
            //没找到删除节点
            if(root==null) return null;
            //找到删除节点
            if(root.val==key)
            {
                //删除节点为叶子节点
                if(root.left==null&&root.right==null)
                {
                    return null;
                }
                //删除节点的左子树为空,右子树不为空
               else if(root.left!=null&&root.right==null)
                {
                        return root.left;
                }
                //删除节点的右子树为空,左子树不为空
               else if(root.right!=null&&root.left==null)
                {
                        return root.right;
                }
                //删除节点的左右子树都不为空
                else
                {

                    //右孩子继位
                        TreeNode cur=root.right;
                        while(cur.left!=null) cur=cur.left;
                        cur.left=root.left;

                        //此时为左为空,右不为空
                    return root.right;
                }
            }
            /*单层递归*/
            if(key<root.val)
            {
                root.left=deleteNode(root.left,key);
            }
            else
            {
                root.right=deleteNode(root.right,key);
            }
            return  root;

        }
    }

标签:val,root,二叉,搜索,null,树中,节点,left
From: https://www.cnblogs.com/FreeDrama/p/18416719

相关文章

  • leetcode刷题day20|二叉树Part08(669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索
    669.修剪二叉搜索树思路:理解了删除二叉搜索树中的节点,这个题理解起来就不难了。还是选用中序遍历递归。递归三步曲:1、传入参数:根节点,最小值,最大值;返回值为根节点;2、终止条件:如果节点为空,直接返回空;3、递归逻辑:如果最小值小于该节点,递归调用该节点的右孩子(检查右孩子......
  • leetcode刷题day19|二叉树Part07(235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的
    235.二叉搜索树的最近公共祖先思路:二叉搜索树首先考虑中序遍历。根据二叉搜索树的特性,如果p,q分别在中间节点的左右两边,该中间节点一定是最近公共祖先,如果在同一侧,则递归这一侧即可。递归三部曲:1、传入参数:根节点,p,q,返回节点。2、终止条件:因为p,q一定存在,所以不会遍历到......
  • 搜索 DFS深度优先搜索
    洛谷P1363幻象迷宫这种恶魔样例究竟是哪个天才想出来的?!!!!!!620#.##.##.##.##.##.##.#.##.##.##.##.##.##.#.##.##.##.##.##.##.S.#..#..#..#..#..#..##..#..#..#..#..#..##..#..#..#..#..#..##md,交了好几发都没过,看了一下这个样例,心都凉了。能想出来这题解的更是天才Orz......
  • 代码随想录算法 - 二叉树6
    题目1235.二叉搜索树的最近公共祖先给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”例如......
  • Day16 二叉树part06| LeetCode 530.二叉搜索树的最小绝对差 ,501.二叉搜索树中的众数,23
    530.二叉搜索树的最小绝对差530.二叉搜索树的最小绝对差classSolution{publicList<Integer>res=newArrayList<>();voidtraversal(TreeNoderoot){if(root==null)return;traversal(root.left);......
  • 搜索
    1、BFS广度优先搜索一般用于地图的搜索遍历,最短路中的SPFA也是洛谷P1126机器人搬重物<1>对于面对方向的计算设四个方向分别为0,1,2,3转向的时候只需要(原方向代号+4±1)%4就可以得到转向后面对的新方向<2>对于每种状态,构建hash,在每次走后判断该种情况是否已经出现......
  • Day15 二叉树part05| LeetCode 654.最大二叉树,617.合并二叉树 ,700.二叉搜索树中的搜索
    654.最大二叉树654.最大二叉树classSolution{publicTreeNodeconstructMaximumBinaryTree(int[]nums){if(nums.length==1)//遍历到了叶子节点{returnnewTreeNode(nums[0]);}intmaxValue=nums[0......
  • Java-数据结构-二叉树-习题(二) (´▽`)ノ
    文本目录:❄️一、习题一(分层遍历):   ▶ 思路:    ▶代码:❄️二、习题二(二叉树的最近公共祖先):    ▶ 思路: ▶代码: ❄️三、习题三(从前序和中序遍历序列中构造二叉树):     ▶ 思路:  ▶代码:❄️四、习题四(从中序和后序遍历序列中构造二......
  • 使用 O(1) 额外内存删除二叉树
    这是一个naive的做法:voiddeleteTreeRec(TreeNode*root){if(root==NULL)return;deleteTreeRec(root->left);deleteTreeRec(root->right);cout<<"Deletingnode"<<root->data<<endl;deleteroot;}O(1)空......
  • 力扣热题100 - 二叉树:二叉搜索树中第 K 小的元素
    题目描述:题号:230给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从1开始计数)。解题思路:思路一:中序遍历二叉树+ 计数根据二叉搜索树的性质,中序遍历得到的节点的顺序是从小到大递增的。所以可以一边中序遍历,一边计数......