力扣450 补9.15

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

可以做,就是去分类讨论,一开始以为有重复节点,感觉挺麻烦的,不过没有重复结点,感觉好做一点了,不过写结点指针赋值的时候把值赋反了,搞得一直报错,还是指针用的不熟练。

这个中等题大概做了有2个小时,水平大概就这样了,也是慢慢磨把思路磨出来的。

不过大佬的解法精简的让人称奇,不像我只会暴力,菜狗的我第n次被大佬虐。

 

class Solution {

    public TreeNode deleteNode(TreeNode root, int key) {

        if(root==null) return null;

        if(root.val==key) {

            if(root.left==null){

                return root.right;

            }else if(root.right==null){

                return root.left;

            }else if(root.left!=null&&root.right!=null){

                TreeNode p=root.left;

                while(p.right!=null){

                    p=p.right;

                }

                p.right=root.right;

                return root.left;

            }

        }

        dfs(root,key);

        return root;

    }

    void dfs(TreeNode root,int key){

        // 这个解法不够好,如果树里有重复节点就寄了,但对本题有效

        if(root==null) return;

        if(root.left!=null&&root.left.val==key){  

            if(root.left.right!=null) {   

            TreeNode p=root.left.right;

            while(p.left!=null) p=p.left;

            p.left=root.left.left;

            }

            else root.left.right=root.left.left;

            root.left=root.left.right;

        }else if(root.right!=null&&root.right.val==key){

            if(root.right.right!=null){

            TreeNode p=root.right.right;

            while(p.left!=null) p=p.left;

            p.left=root.right.left;

            }

            else root.right.right=root.right.left;

            root.right=root.right.right;

        }

        

        dfs(root.left,key);

        

        dfs(root.right,key);

    }

}

 

 

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