Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @Override
- public void remove(T element) {
- BSTNode<T> node = this.search(element); //Nó a ser removido
- if(!node.isEmpty()){ //Nao é possivel remover um no sentinela, entao verifica se o resultado da busca é um no sentinela.
- if(node.isLeaf()){
- node.setData(null);
- node.setLeft(null);
- node.setRight(null);
- rebalanceUp(node); //Vai subindo ate chegar no no desbalanceado
- }else if(!node.isLeaf() && temApenasUmFilho(node)){ //Caso o node a ser removido NÃO seja folha e tenha apenas um filho
- if(!node.equals(root)){
- if(this.isLeftChild(node)){ //Se o node a ser removido for filho a esquerda:
- if(!node.getLeft().isEmpty()){
- node.getParent().setLeft(node.getLeft());
- node.getLeft().setParent(node.getParent());
- }else{
- node.getParent().setLeft(node.getRight());
- node.getRight().setParent(node.getParent());
- }
- }else{
- if(!node.getLeft().isEmpty()){ //Se o node a ser removido tiver filho a esquerda
- node.getParent().setRight(node.getLeft());
- node.getLeft().setParent(node.getParent());
- }else{
- node.getParent().setRight(node.getRight());
- node.getRight().setParent(node.getParent());
- }
- }
- }else{
- if (!node.getLeft().isEmpty()){
- this.root = (BSTNode<T>) node.getLeft();
- this.root.setParent(null);
- }else{
- this.root = (BSTNode<T>) node.getRight();
- this.root.setParent(null);
- }
- }
- rebalanceUp(node);
- }else if(!node.isLeaf() && !temApenasUmFilho(node)){
- BSTNode<T> sucessor = this.sucessor(node.getData());
- T data = sucessor.getData();
- this.remove(sucessor.getData());
- node.setData(data);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement