zoukankan      html  css  js  c++  java
  • 450_删除二叉搜索树中的节点

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

    package 二叉树.二叉搜索树;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Queue;
    
    /**
     * https://leetcode-cn.com/problems/delete-node-in-a-bst/
     * 
     * @author Huangyujun
     *
     */
    public class _450_删除二叉搜索树中的节点 {
    
        //前驱、后驱离当前要删除的结点最近
        class Solution {
            //后驱
            public int successor(TreeNode root) {
                root = root.right;
                while (root.left != null)
                    root = root.left;
                return root.val;
            }
    
            //前驱
            public int predecessor(TreeNode root) {
                root = root.left;
                while (root.right != null)
                    root = root.right;
                return root.val;
            }
            //删除值大于 根值,则只能在左子树删除目标,删除值小于根值,只能子啊右子树删除目标
            //当删除的目标就是根值时,考虑:① 根是叶子 【根置空】  ② 有右子树 【根用后驱结点值覆盖,然后对右子树的重复结点进行删除】 ③ 没有右子树【只能到左子树找了,根用前驱结点值覆盖,然后对左子树的重复结点进行删除】  
            public TreeNode deleteNode(TreeNode root, int key) {
                if (root == null)
                    return null;
                if (key > root.val)
                    root.right = deleteNode(root.right, key);
                else if (key < root.val)
                    root.left = deleteNode(root.left, key);
                // delete the current node
                else {
                    //找到了,(1)是叶子结点
                    // the node is a leaf
                    if (root.left == null && root.right == null)
                        root = null;
                    // the node is not a leaf and has a right child
                    ////找到了,(2)不是是叶子结点(但是有右子树)
                    //先通过后驱结点将值覆盖掉找到的结点,然后删除右孩子
                    else if (root.right != null) {
                        root.val = successor(root);
                        root.right = deleteNode(root.right, root.val);
                    }
                    // the node is not a leaf, has no right child, and has a left child
                    else {
                        root.val = predecessor(root);
                        root.left = deleteNode(root.left, root.val);
                    }
                }
                return root;
            }
        }    
    }

    本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15709280.html

  • 相关阅读:
    crontab自动备份MySQL数据库并删除5天前备份
    使用ShowDoc在线管理API接口文档
    概率计算(抽奖活动、命中率)
    保护隐私?找回已记住的秘密?你的余额宝、淘宝还安全吗?
    自制公众平台Web Api(微信)
    我为什么期待M#?
    在.net中为什么第一次执行会慢?
    记”Uri.IsWellFormedUriString”中的BUG
    公司ERP系统重构那些事
    Koala Framework是什么?我为什么要写这个框架?
  • 原文地址:https://www.cnblogs.com/shan333/p/15709280.html
Copyright © 2011-2022 走看看