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

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

递归法:

public class Solution {
    public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null)
        {
            return null;
        }
        if(root==p||root==q)
        {
            return root;
        }
        var left=LowestCommonAncestor(root.left,p,q);
        var right=LowestCommonAncestor(root.right,p,q);
        if(left!=null&&right!=null)
        {
            return root;
        }
        if(left==null&&right!=null)
        {
            return right;
            }
        else if(left!=null&&right==null)
        {
            return left;
        }else
        return null;

    }
}

参考二叉树最近公共祖先流程。

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

递归法:

public class Solution {
    public TreeNode InsertIntoBST(TreeNode root, int val) {
        if(root==null)
        {
            root=new TreeNode(val);
        }
        if(root.val>val)
        {
            InsertIntoBST(root.left,val);
        }
        if(root.valval&&root.left==null)
        {
            root.left=new TreeNode(val);
            return root;
        }
        if(root.val

如果根节点为空,直接在根节点处新建一个Val值得节点。得益于二叉搜索树的特性,如果Val值比根节点的值小,就去左子树插入,如果Val值比根节点的值大,就去右子树插入。如果当前节点的值大于Val并且当前节点的右节点为空就在左节点处新建一个Val值节点完成插入操作然后返回根节点,同理当前节点值小于Val且右节点为空就在右节点处插入该值,然后返回根节点。

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

递归法:

public class Solution {
    public TreeNode DeleteNode(TreeNode root, int key) {
        if(root==null)
        {
            return null;
        }
        if(key==root.val)
        {
        if(root.left==null&&root.right==null)
        {
            return null;
        }
        if(root.left!=null&&root.right==null)
        {
            return root.left;
        }
        if(root.left==null&&root.right!=null)
        {
            return root.right;
        }
        if(root.left!=null&&root.right!=null)
        {
            var cur=root.right;
            while(cur.left!=null)
            {
                cur=cur.left;
            }
            cur.left=root.left;
            return root.right;
        }
        }
        if(root.val>key)
        {
            root.left=DeleteNode(root.left,key);
        }
        if(root.val

根节点如果为空,直接返回空。如果当前节点等于Key值,则分为以下几种情况:当前节点为叶子节点直接向上返回Null即可,当前节点左节点不为空右节点为空,直接往上返回左节点,当前节点右节点不为空左节点为空,则往上返回右节点。如果当前节点的左右节点都不为空,那就新建一个节点Cur指向右节点然后将Cur向左遍历到叶子结点,接着将该节点的左节点赋值给Cur的左节点,然后向上返回当前节点的右节点即可。得益于二叉搜索树的特性,如果Key值大于当前节点的值则向右进行递归操作,反之往左递归。

你可能感兴趣的:(算法,leetcode,职场和发展,数据结构,c#)