Remove Node in Binary Search Tree(删除二叉查找树的节点)

http://www.lintcode.com/zh-cn/problem/remove-node-in-binary-search-tree/?rand=true#

/**
 * Definition of TreeNode:
 * public class TreeNode {
 * public int val;
 * public TreeNode left, right;
 * public TreeNode(int val) {
 * this.val = val;
 * this.left = this.right = null;
 * }
 * }
 */


public class Solution {
    private TreeNode parent;
    private TreeNode target;
    private boolean isTargetLeft;

    /*
     * @param root: The root of the binary search find.
     * @param value: Remove the node with given value.
     * @return: The root of the binary search find after removal.
     */
    public TreeNode removeNode(TreeNode root, int value) {
        // write your code here
        TreeNode dummy = new TreeNode(Integer.MAX_VALUE);
//        构造一个节点,解决要删除的是根节点的问题
        dummy.left = root;
        if (find(dummy, root, value, true)) {
//            查找到之后做删除操作
            delete();
        }
        return dummy.left;
    }

    private void delete() {
        TreeNode left = target.left;
        TreeNode right = target.right;
//            如果左右节点有一个为空,直接把不为空的替代就可以了。
        if (left == null) {
            if (isTargetLeft) {
                parent.left = right;
            } else {
                parent.right = right;
            }
        } else if (right == null) {
            if (isTargetLeft) {
                parent.left = left;
            } else {
                parent.right = left;
            }
        } else {
//            如果都不为空,可以找左边的最大,也可以找右边的最小,这里是找左边的最大
            TreeNode temp = target.left;
            TreeNode father = target;
//            找左边最大的就是一直找左边的右节点
            while (temp.right != null) {
                father = temp;
                temp = temp.right;
            }
//            找到后先把自己删除掉
            if (father.left == temp) {
                father.left = temp.left;
            } else {
                father.right = temp.left;
            }
//            然后把刚才找到的节点放到目录节点的位置
            if (isTargetLeft) {
                parent.left = temp;
            } else {
                parent.right = temp;
            }
//            替换目标节点的子节点
            temp.left = target.left;
            temp.right = target.right;
        }
    }

    //    查找需要删除的节点,一定要记下来节点的父节点,方便后边做删除处理,记录下来是父节点的左节点还是右节点
    private boolean find(TreeNode dummy, TreeNode root, int value, boolean b) {
        if (root == null) {
            return false;
        }
        if (root.val == value) {
            parent = dummy;
            target = root;
            isTargetLeft = b;
            return true;
        } else if (root.val > value) {
            return find(root, root.left, value, true);
        } else {
            return find(root, root.right, value, false);
        }
    }
}

你可能感兴趣的:(Remove Node in Binary Search Tree(删除二叉查找树的节点))