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


一、题目

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

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

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

二、解法

node表示找到的节点,prev表示前驱节点。由于node可能就是root,所以要设置一个虚拟头结点vHead。

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

        TreeNode l=node.left,r=node.right,n;
        if(l!=null&&r!=null){
            TreeNode k=l;
            while(k.right!=null) k=k.right;
            k.right=r.left;
            r.left=l;
            n=r;
        }else{
            n=l==null?r:l;
        }
        if(prev.left==node) prev.left=n;
        else prev.right=n;
        return vHead.left;
    }
}

相关