Assignment 8: bst solve
This commit is contained in:
parent
99055cd188
commit
a53268bb3e
@ -24,11 +24,96 @@ public class Assignment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void insert(int toInsert) {
|
public void insert(int toInsert) {
|
||||||
// Insert the provided element into the tree
|
// Insert the provided element into the tree
|
||||||
|
Node newNode = new Node();
|
||||||
|
newNode.val = toInsert;
|
||||||
|
if (root == null) {
|
||||||
|
root = newNode;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Node parent = root;
|
||||||
|
while (newNode.parent == null) {
|
||||||
|
if (toInsert < parent.val) {
|
||||||
|
if (parent.left == null) {
|
||||||
|
parent.left = newNode;
|
||||||
|
newNode.parent = parent;
|
||||||
|
} else {
|
||||||
|
parent = parent.left;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (parent.right == null) {
|
||||||
|
parent.right = newNode;
|
||||||
|
newNode.parent = parent;
|
||||||
|
} else {
|
||||||
|
parent = parent.right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void delete(int toDelete) {
|
public void delete(int toDelete) {
|
||||||
// Delete the provided element from the tree
|
// Delete the provided element from the tree
|
||||||
|
Node toDeleteNode = root;
|
||||||
|
|
||||||
|
while (toDeleteNode != null && toDeleteNode.val != toDelete) {
|
||||||
|
if (toDelete < toDeleteNode.val) {
|
||||||
|
toDeleteNode = toDeleteNode.left;
|
||||||
|
} else {
|
||||||
|
toDeleteNode = toDeleteNode.right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// case 0: Node not found or tree is empty
|
||||||
|
if (toDeleteNode == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// case 1: Node has no children
|
||||||
|
if (toDeleteNode.left == null && toDeleteNode.right == null) {
|
||||||
|
if (toDeleteNode.parent == null) {
|
||||||
|
root = null;
|
||||||
|
} else if (toDeleteNode.parent.left == toDeleteNode) {
|
||||||
|
toDeleteNode.parent.left = null;
|
||||||
|
} else {
|
||||||
|
toDeleteNode.parent.right = null;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// case 2: Node has one child
|
||||||
|
if (toDeleteNode.left == null || toDeleteNode.right == null) {
|
||||||
|
Node child = toDeleteNode.left == null ? toDeleteNode.right : toDeleteNode.left;
|
||||||
|
if (toDeleteNode.parent == null) {
|
||||||
|
root = child;
|
||||||
|
} else if (toDeleteNode.parent.left == toDeleteNode) {
|
||||||
|
toDeleteNode.parent.left = child;
|
||||||
|
} else {
|
||||||
|
toDeleteNode.parent.right = child;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// case 3: Node has two children
|
||||||
|
Node successor = toDeleteNode.right;
|
||||||
|
while (successor.left != null) {
|
||||||
|
successor = successor.left;
|
||||||
|
}
|
||||||
|
// remove successor from its current position
|
||||||
|
if (successor.parent.left == successor) {
|
||||||
|
successor.parent.left = successor.right;
|
||||||
|
} else {
|
||||||
|
successor.parent.right = successor.right;
|
||||||
|
}
|
||||||
|
// replace toDeleteNode with successor
|
||||||
|
successor.parent = toDeleteNode.parent;
|
||||||
|
successor.left = toDeleteNode.left;
|
||||||
|
successor.right = toDeleteNode.right;
|
||||||
|
if (toDeleteNode.parent == null) {
|
||||||
|
root = successor;
|
||||||
|
} else if (toDeleteNode.parent.left == toDeleteNode) {
|
||||||
|
toDeleteNode.parent.left = successor;
|
||||||
|
} else {
|
||||||
|
toDeleteNode.parent.right = successor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -47,17 +132,32 @@ public class Assignment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void inOrder(Node curr) {
|
private void inOrder(Node curr) {
|
||||||
// Print the elements in the tree one one each line
|
// Print the elements in the tree one on each line
|
||||||
|
if (curr == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
inOrder(curr.left);
|
||||||
System.out.println(curr.val);
|
System.out.println(curr.val);
|
||||||
|
inOrder(curr.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void preOrder(Node curr) {
|
private void preOrder(Node curr) {
|
||||||
// Print the elements in the tree one one each line
|
// Print the elements in the tree one on each line
|
||||||
|
if (curr == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
System.out.println(curr.val);
|
System.out.println(curr.val);
|
||||||
|
preOrder(curr.left);
|
||||||
|
preOrder(curr.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void postOrder(Node curr) {
|
private void postOrder(Node curr) {
|
||||||
// Print the elements in the tree one one each line
|
// Print the elements in the tree one on each line
|
||||||
|
if (curr == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
postOrder(curr.left);
|
||||||
|
postOrder(curr.right);
|
||||||
System.out.println(curr.val);
|
System.out.println(curr.val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user