/******************************************************************************* * Copyright (c) 2012-present Jakub Kováč, Jozef Brandýs, Katarína Kotrlová, * Pavol Lukča, Ladislav Pápay, Viktor Tomkovič, Tatiana Tóthová * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package algvis.ds.dictionaries.aatree; import algvis.core.Algorithm; import algvis.core.Node; import algvis.core.NodeColor; import algvis.core.visual.ZDepth; import algvis.ds.dictionaries.bst.BSTFind; import algvis.ds.dictionaries.bst.BSTNode; public class AADelete extends Algorithm { private final AA T; private final int K; public AADelete(AA T, int x) { super(T.panel); this.T = T; K = x; } // TODO niektore kroky ("This node is OK) nemaju pauzy @Override public void runAlgorithm() { setHeader("delete", K); addNote("bstdeletestart"); final BSTFind find = new BSTFind(T, K, this); find.runAlgorithm(); final AANode toDelete = (AANode) find.getResult().get("node"); if (toDelete != null) { setHeader("delete", K); addToScene(toDelete); toDelete.setColor(NodeColor.DELETE); AANode w = toDelete.getParent(); if (toDelete.isLeaf()) { // case I - list addStep("bst-delete-case1"); pause(); if (toDelete.isRoot()) { T.setRoot(null); } else if (toDelete.isLeft()) { toDelete.getParent().unlinkLeft(); } else { toDelete.getParent().unlinkRight(); } } else if (toDelete.getLeft() == null || toDelete.getRight() == null) { // case // IIa - // 1 syn addStep("bst-delete-case2"); pause(); final AANode s = (toDelete.getLeft() == null) ? toDelete .getRight() : toDelete.getLeft(); if (toDelete.isRoot()) { T.setRoot(s); } else { if (toDelete.isLeft()) { toDelete.getParent().linkLeft(s); } else { toDelete.getParent().linkRight(s); } } } else { // case III - 2 synovia addStep("bst-delete-case3"); final int lev = toDelete.getLevel(); AANode s = toDelete.getRight(); BSTNode v = new BSTNode(T, -Node.INF, ZDepth.ACTIONNODE); v.setColor(NodeColor.FIND); addToScene(v); v.goTo(s); pause(); while (s.getLeft() != null) { s = s.getLeft(); v.goTo(s); pause(); } w = s.getParent(); if (w == toDelete) { w = s; } removeFromScene(v); v = s; addToScene(v); if (s.isLeft()) { s.getParent().linkLeft(s.getRight()); } else { s.getParent().linkRight(s.getRight()); } v.goNextTo(toDelete); pause(); v.setLevel(lev); if (toDelete.getParent() == null) { T.setRoot(v); } else { if (toDelete.isLeft()) { toDelete.getParent().linkLeft(v); } else { toDelete.getParent().linkRight(v); } } removeFromScene(v); v.linkLeft(toDelete.getLeft()); v.linkRight(toDelete.getRight()); v.goTo(toDelete); v.calc(); } // end case III toDelete.goDown(); removeFromScene(toDelete); T.reposition(); pause(); // bubleme nahor while (w != null) { final int ll = (w.getLeft() == null) ? 0 : w.getLeft() .getLevel(), rl = (w.getRight() == null) ? 0 : w.getRight() .getLevel(); int wl = w.getLevel(); addStep("aaok"); w.mark(); if (ll < wl - 1 || rl < wl - 1) { wl--; w.setLevel(w.getLevel() - 1); if (rl > wl) { w.getRight().setLevel(wl); } // skew if (w.getLeft() != null && w.getLeft().getLevel() == w.getLevel()) { addStep("aaskew"); pause(); w.unmark(); w = w.getLeft(); w.mark(); w.setArc(); pause(); w.noArc(); T.rotate(w); T.reposition(); } if (w.getRight() != null) { T.skew(w.getRight()); AANode r = w.getRight(); if (r.getLeft() != null && r.getLeft().getLevel() == r.getLevel()) { addStep("aaskew2"); r.getLeft().setArc(r); pause(); r.getLeft().noArc(); pause(); T.rotate(r.getLeft()); T.reposition(); } if (w.getRight().getRight() != null) { r = w.getRight().getRight(); if (r.getLeft() != null && r.getLeft().getLevel() == r.getLevel()) { addStep("aaskew3"); r.getLeft().setArc(r); pause(); r.getLeft().noArc(); T.rotate(r.getLeft()); T.reposition(); } } } AANode r = w.getRight(); if (r != null && r.getRight() != null && r.getRight().getLevel() == w.getLevel()) { addStep("aasplit"); r.setArc(); pause(); r.noArc(); w.unmark(); w = r; w.mark(); T.rotate(w); w.setLevel(w.getLevel() + 1); T.reposition(); } pause(); if (w.getRight() != null) { r = w.getRight().getRight(); if (r != null && r.getRight() != null && r.getRight().getLevel() == w.getRight() .getLevel()) { addStep("aasplit2"); r.setArc(); pause(); r.noArc(); T.rotate(r); r.setLevel(r.getLevel() + 1); T.reposition(); } } pause(); } w.unmark(); w = w.getParent(); } T.reposition(); addNote("done"); } } }