memory - java: Building a Tri-nary tree and my nodes won't be deleted -
building tribunary tree in java , delete functionality doesn't seem working. can me understand why won't delete variable node?
node = null;
my code, compile , run:
import java.util.hashmap; import java.util.iterator; import java.util.map; import java.util.set; public class tritree { public static void main(string[] args) { new tritree().run(); } static class trinode { trinode left; trinode middle; trinode right; int value; public trinode(int value) { this.value = value; } } private map<integer,string> tritreelevels=new hashmap<integer, string>(); public void run() { // build simple tree chapter 11. trinode root = new trinode(50); system.out.println("binary tree example"); system.out.println("building tree root value " + root.value); insert(root, 25); insert(root, 30); insert(root, 10); insert(root, 100); insert(root, 190); insert(root, 80); insert(root, 89); insert(root, 75); insert(root, 150); insert(root, 200); insert(root, 125); insert(root, 175); insert(root, 999); deletenode(root, 999); system.out.println("traversing tree in order"); printbyorder(root); j system.out.println("tree levels"); printbyorder(root); printbytreelevels(root); deletenode(root, 100); system.out.println("deleting 100"); system.out.println("tree levels"); printbytreelevels(root); deletenode(root, 10); system.out.println("deleting 10"); system.out.println("tree levels"); printbytreelevels(root); deletenode(root, 200); system.out.println("deleting 200"); system.out.println("tree levels"); printbytreelevels(root); } public void insert(trinode node, int value) { if (value < node.value) { if (node.left != null) { insert(node.left, value); } else { system.out.println(" inserted " + value + " left of " + node.value); node.left = new trinode(value); } } else if (value == node.value) { if(node.middle != null){ insert(node.middle, value); }else{ system.out.println(" inserted " + value + " middle of " + node.value); node.middle = new trinode(value); } } else if (value > node.value) { if (node.right != null) { insert(node.right, value); } else { system.out.println(" inserted " + value + " right of " + node.value); node.right = new trinode(value); } } } public void printbyorder(trinode node) { //prints existing node , calls print on children if (node != null) { printbyorder(node.left); if(node.middle != null){ printbyorder(node.middle); } system.out.println(" traversed " + node.value); printbyorder(node.right); } } public void printbytreelevels(trinode node){ //clear tritreelevels previous fills tritreelevels.clear(); loadtreelevels(node, 0); displaytreelevels(); } public void loadtreelevels(trinode node, int level) { //add current node specified level. if(tritreelevels.get(level) != null) tritreelevels.put(level, tritreelevels.get(level) + node.value + " "); else tritreelevels.put(level, node.value + " "); //this next section loads existing children nodes in next level if(node.left != null) loadtreelevels(node.left, level+1); if(node.middle != null) loadtreelevels(node.middle, level+1); if(node.right != null) loadtreelevels(node.right, level+1); } public void displaytreelevels() { //incremently print levels of tree for(int = 0; < tritreelevels.size(); i++){ system.out.println(i+": "+tritreelevels.get(i)); } } public void deletenode(trinode node, int value) { if(node.value < value){ deletenode(node.right, value); }else if(node.value > value){ deletenode(node.left, value); }else{ if(node.left == null && node.middle == null && node.right == null){ //node leaf, safe remove node = null; }else if(node.middle != null){ //node contains duplicate used it's spare node = node.middle; }else if(node.left != null && node.right == null){ //node contains left, it's removed being replaced left node node = node.left; }else if(node.left == null && node.middle == null && node.right != null){ //node contains right, it's removed being replaced right node node = node.right; }else{ //at point lose complexity of 3 children. if deleted node had duplicate have been replaced. if(node.right.left == null){ //right node doesn't have left child //right node inherits left node left child node.right.left = node.left; //and replaces current 1 node = node.right; }else{ trinode replacementnode; trinode parentoflowestnode = node.right; //keep traversing until find lowest value on left side while(parentoflowestnode.left.left != null) parentoflowestnode = parentoflowestnode.left; //replacement node lowest value replacementnode = parentoflowestnode.left; //lowest value node way left //it replaced it's right child if has 1 parentoflowestnode.left = replacementnode.right; //finish building replacement node supplying it's left , right children of node deleted replacementnode.left = node.left; replacementnode.right = node.right; //replace node deleted node = replacementnode; } } } } }
node = null
sets reference node
null. it's not deleting node in tree. delete node in tree, must set left
, middle
, or right
variable of parent node null.
node
local, temporary variable used method deletenode()
reference node want deleted.
Comments
Post a Comment