public NodeRBT <T> GetSuccessor() { NodeRBT <T> x = this; if (x.right != RBT <T> .nil) { return(RBT <T> .GetMinNode(x.right)); } NodeRBT <T> y = x.p; while (y != RBT <T> .nil && x == y.right) { x = y; y = y.p; } return(y); }
private void LevelOrder(RBT <T> T) // Breadth { int level = 0; int height = T.GetHeight(T.root); var queue = new Queue <NodeRBT <T> >(); Queue <int> queueLevel = new Queue <int>(); if (T.root != nil) { // enqueue current root queue.Enqueue(T.root); queueLevel.Enqueue(0); int currentLevel = 0; // while there are nodes to process while (queue.Count != 0) { // dequeue next node NodeRBT <T> node = queue.Dequeue(); level = queueLevel.Dequeue(); if (currentLevel != level) { currentLevel = level; Console.WriteLine(); } Console.Write($"{(node.color == Color.RED?"[":"(")}{node.key}{(node.color == Color.RED ? "]" : ")")}:L:{level}({node.left},{node.right}),"); // enqueue child elements from next level in order if (node.left != nil /* tree has non-empty left subtree*/) { queue.Enqueue(node.left); queueLevel.Enqueue(level + 1); } if (node.right != nil /*tree has non-empty right subtree */) { queue.Enqueue(node.right); queueLevel.Enqueue(level + 1); } } Console.WriteLine(); } }
static void Main(string[] args) { //BST<int> myTree= new BST<int>(); //myTree.InsertValue(10); //myTree.InsertValue(5); //myTree.InsertValue(20); //myTree.InsertValue(1); //myTree.InsertValue(4); //myTree.InsertValue(15); //myTree.InsertValue(31); //int h = rand.Next(10, 20); //for (int i = 0; i < h; i++) //{ // int v = rand.Next(100); // myTree.InsertValue(v); // Console.Write($"{v}, "); //} //Console.WriteLine(); //Console.WriteLine("IN ORDER"); //myTree.InOrder(); //Console.WriteLine(); //Console.WriteLine("LEVEL ORDER"); //myTree.LevelOrder(); //Console.WriteLine(); //Console.WriteLine($"Height: {myTree.GetHeight()}"); //Console.WriteLine(); //var foundNode = myTree.SearchTree(15); //if (foundNode != null) //{ // Console.WriteLine(foundNode.key); //} //Console.WriteLine(); //int value = 93; //foundNode = myTree.SearchTree(value); //if (foundNode != null) //{ // Console.WriteLine($"Successor of {value} : { myTree.SearchTree(value).GetSuccessor().key}"); //} //value = rand.Next(34); //foundNode = myTree.SearchTree(value); //if (foundNode != null) //{ // Console.WriteLine($"Delete {value}"); // myTree.DeleteNode(foundNode); //} //Console.WriteLine("IN ORDER"); //myTree.InOrder(); //Console.WriteLine(); //Console.WriteLine("POST ORDER"); //myTree.PostOrder(); //Console.WriteLine(); //Console.WriteLine("PRE ORDER"); //myTree.PreOrder(); //Console.WriteLine(); //Console.WriteLine("LEVEL ORDER"); //myTree.LevelOrder(); //Console.WriteLine($"Height: {myTree.GetHeight()}"); //Shuffle(myTree.nodes); //foreach (var item in myTree.nodes) //{ // Console.Write($"{item},"); //} //Console.WriteLine(); var myRBTree = new RBT <int>(); myRBTree.InsertValue(1); myRBTree.InsertValue(6); myRBTree.InsertValue(4); myRBTree.InsertValue(7); myRBTree.InsertValue(2); myRBTree.InsertValue(5); myRBTree.InsertValue(3); myRBTree.InsertValue(9); myRBTree.LevelOrder(); //Console.WriteLine(myRBTree.Search(4).GetSuccessor()); }