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

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

难度中等974

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

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

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

代码随想录算法训练营第22天|235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点_第1张图片

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if((p.val-root.val)*1L*(q.val-root.val) <=0)return root;
       if(p.val < root.val)return lowestCommonAncestor(root.left,p,q);
       if(p.val > root.val)return lowestCommonAncestor(root.right,p,q);
       return null;
    }
}

 

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

难度中等407

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

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

示例 1:

代码随想录算法训练营第22天|235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点_第2张图片

class Solution {
    TreeNode root;
    public TreeNode insertIntoBST(TreeNode root, int val) {
       if(root == null)return new TreeNode(val);
        this.root = root;
        dfs(root,val);
        return root;
    }
    public void dfs(TreeNode root,int val){
        if(val < root.val){
            if(root.left == null){
                root.left = new TreeNode(val);
            }else{
                 insertIntoBST(root.left,val);
            }
        }else if(val > root.val){
            if(root.right == null){
                root.right = new TreeNode(val);
            }else{
                 insertIntoBST(root.right,val);
            }
        }
    }
}

 

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

难度中等1017

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

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

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

代码随想录算法训练营第22天|235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点_第3张图片

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null)return root;
        if(key < root.val){
            root.left = deleteNode(root.left,key);
        }else if(key > root.val){
            root.right = deleteNode(root.right,key);
         }else{
             if(root.left != null && root.right != null){
                 TreeNode tmp = root.right;
                 while(tmp.left != null){
                     tmp = tmp.left;
                 }
                 tmp.left = root.left;
                 return root.right;
             }else if(root.left == null){
                 return root.right;
             }else if(root.right == null){
                 return root.left;
             }

         }
         return root;
    }
}

 

 

 

你可能感兴趣的:(代码训练营刷题,算法)