LintCode : 删除二叉查找树的节点

删除二叉查找树的节点

给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。

您在真实的面试中是否遇到过这个题? 
Yes
样例

给出如下二叉查找树:

          5

       /    \

    3          6

 /    \

2       4

删除节点3之后,你可以返回:

          5

       /    \

    2          6

      \

         4

或者:

          5

       /    \

    4          6

 /   

2


  • 递归找到需要删除的节点findNode
  • 递归找到需要删除的节点的父节点preFindNode
  • 删除findNode节点
  • /**
     * 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 {
        /**
         * @param root: The root of the binary search tree.
         * @param value: Remove the node with given value.
         * @return: The root of the binary search tree after removal.
         */
        public static TreeNode removeNode(TreeNode root, int value) {
            // write your code here
            if (root == null) {
                return null;
            }
            if (root.val == value && root.left == null && root.right == null) {
                return null;
            } else if (root.val == value) {
                if (root.left != null) {
                    root.left.right = root.right;
                    return root.left;
                } else {
                    return root.right;
                }
    
            }
            TreeNode findNode = findNode(root, value);
            if (findNode != null) {
                TreeNode preFindNode = findPreNode(root, findNode.val);
                if (preFindNode.val > findNode.val) { // 在左子树上找到
                    if (findNode.left == null && findNode.right == null) {
                        preFindNode.left = null;
                    }
                    if (findNode.left == null && findNode.right != null) {
                        preFindNode.left = findNode.right;
                    }
                    if (findNode.left != null && findNode.right == null) {
                        preFindNode.left = findNode.left;
                    }
                    if (findNode.left != null && findNode.right != null) {
                        preFindNode.left = findNode.left;
                        preFindNode.left.right = findNode.right;
                    }
    
                } else { // 在右子树上找到
                    if (findNode.left == null && findNode.right == null) {
                        preFindNode.right = null;
                    }
                    if (findNode.left == null && findNode.right != null) {
                        preFindNode.right = findNode.right;
                    }
                    if (findNode.left != null && findNode.right == null) {
                        preFindNode.right = findNode.left;
                    }
                    if (findNode.left != null && findNode.right != null) {
                        preFindNode.right = findNode.left;
                        preFindNode.left.right = findNode.right;
                    }
                }
    
            }
            return root;
        }
    
        public static TreeNode findNode(TreeNode root, int value) {
            if (root == null) {
                return null;
            }
            if (root.val == value) {
                return root;
            }
            if (root.val > value) {
                return findNode(root.left, value);
            }
            if (root.val < value) {
                return findNode(root.right, value);
            }
            return null;
        }
    
        public static TreeNode findPreNode(TreeNode root, int value) {
            if (root == null) {
                return null;
            }
            if (root.left != null && root.left.val == value) {
                return root;
            }
            if (root.right != null && root.right.val == value) {
                return root;
            }
            if (root.val > value) {
                return findPreNode(root.left, value);
            }
            if (root.val < value) {
                return findPreNode(root.right, value);
            }
            return null;
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值