private void Print(node item, int top) { SwapColors(); Print(item.Data, top, item.StartPos); SwapColors(); if (item.GetLeft() != null) { PrintLink(top + 1, "┌", "┘", item.GetLeft().StartPos + item.GetLeft().Size / 2, item.StartPos); } if (item.GetRight() != null) { PrintLink(top + 1, "└", "┐", item.EndPos - 1, item.GetRight().StartPos + item.GetRight().Size / 2); } }
public void InOrderTraversal(node current) { if (current.GetLeft() != null) { InOrderTraversal(current.GetLeft()); } Console.Write($"{current.Data} -> "); if (current.GetRight() != null) { InOrderTraversal(current.GetRight()); } }
private node Traverse(dynamic _Data, node _Current) { //Check whether to branch to the right or the left in the tree. if (_Data < _Current.Data) { return(_Current.GetLeft()); } return(_Current.GetRight()); }
public bool Delete(dynamic _Data) { //Traverse to the node we are trying to delete Current = Root; //try statement will run unless the node does not exitst, in which case it will throw an exception and return false. try { while (true) { if (_Data != Current.Data) { Current = Traverse(_Data, Current); } else { break; } } } catch { //If it can't be found, return false return(false); } if (Current.GetLeft() != null && Current.GetRight() != null) { //If it has 2 children node temp = Current.GetLeft(); //Traverse to node that will replace Current while (true) { if (temp.GetRight() != null) { temp = temp.GetRight(); } else { break; } } Current.Data = temp.Data; //Find if the temp node is a left or a right node before deleting. if (temp.GetParent() == Current) { //If the current node is parent to our replacing node. (Only 1 level down) Current.SetLeft(temp.GetLeft()); if (temp.GetLeft() != null) { temp.GetLeft().SetParent(temp.GetParent()); } } else { //If we could traverse down the left hand side if (temp.GetLeft() != null) { temp.GetParent().SetRight(temp.GetLeft()); temp.GetLeft().SetParent(temp.GetParent()); } else { temp.GetParent().SetRight(null); } } return(true); } else if (Current.GetLeft() != null || Current.GetRight() != null) { bool LeftFlag = false; if (Current == Root) { if (Current.GetLeft() != null) { Root = Current.GetLeft(); } else { Root = Current.GetRight(); } return(true); } if (Current.Data < Current.GetParent().Data) { LeftFlag = true; } if (Current.GetLeft() != null) {//If it has a left child if (LeftFlag == true) { Current.GetParent().SetLeft(Current.GetLeft()); } else { Current.GetParent().SetRight(Current.GetLeft()); } Current.GetLeft().SetParent(Current.GetParent()); } else //If it has a right child { if (LeftFlag == true) { Current.GetParent().SetLeft(Current.GetRight()); } else { Current.GetParent().SetRight(Current.GetRight()); } Current.GetRight().SetParent(Current.GetParent()); } return(true); } else { //If it has no children if (Current == Root) { Root = null; return(true); } else { //Set the parent's relevent pointer to null if (Current.Data <= Current.GetParent().Data) { Current.GetParent().SetLeft(null); return(true); } else { Current.GetParent().SetRight(null); return(true); } } } }