package com.anuragkapur.ds.tree; /** * @author anuragkapur */ public class BSTNodeDeletion { private BSTSuccessorAndPredecessor successorAndPredecessor = new BSTSuccessorAndPredecessor(); /** * TODO: Complete implementation and test * * @param nodeToDelete */ public TreeNode deleteNode(TreeNode rootNode, TreeNode nodeToDelete) { if (nodeToDelete.getLeft() == null) { return replaceParentsChild(rootNode, nodeToDelete, nodeToDelete.getRight()); } else if (nodeToDelete.getRight() == null) { return replaceParentsChild(rootNode, nodeToDelete, nodeToDelete.getLeft()); } else { TreeNode successor = successorAndPredecessor.getSuccessor(nodeToDelete); if (successor.getRight() == null) { successor.setLeft(nodeToDelete.getLeft()); successor.setRight(nodeToDelete.getRight()); return replaceParentsChild(rootNode, nodeToDelete, successor); } else { replaceParentsChild(rootNode, successor, successor.getRight()); successor.setLeft(nodeToDelete.getLeft()); successor.setRight(nodeToDelete.getRight()); return replaceParentsChild(rootNode, nodeToDelete, successor); } } } private TreeNode replaceParentsChild(TreeNode rootNode, TreeNode nodeToReplace, TreeNode nodeToReplaceWith) { if (nodeToReplace.getParent() == null) { return nodeToReplaceWith; } if (nodeToReplace.getParent().getLeft() == nodeToReplace) { nodeToReplace.getParent().setLeft(nodeToReplaceWith); } else { nodeToReplace.getParent().setRight(nodeToReplaceWith); } if (nodeToReplaceWith != null) nodeToReplaceWith.setParent(nodeToReplace.getParent()); return rootNode; } }