Item selectR (link currentTree, int k) { if (currentTree == emptyTree) { return NULLitem; } if (currentTree->left->size == k) { return (currentTree->item); } if (currentTree->left->size > k) { return (selectR (currentTree->left, k)); } return (selectR (currentTree->right, k - 1 - currentTree->left->size)); }
// Treat tree as flattened into an ordered array //k = rank needed to be found Item STselect(int k) { if (k<0 || k>=sizeOfTree)//if key is negitave or if the key is bigger than the Heads Subtree size report error { return NULLitem; //return null since there is no item that has that rank } return selectR(head, k); }
//h=node being investigated, k= key needing to be found Item selectR(link h, int k) // See Sedgewick - implements "zero-based indexing". // Returns the kth smallest key where k=0 returns the smallest // key. Thus, this is like flattening the tree inorder into an array // and applying k as a subscript. { int t = h->rank; if (h == z) { printf("Impossible situation in selectR\n"); STprintTree(); exit(0); } if (t > k){ return selectR(h->l, k); } if (t < k){ return selectR(h->r, k-t-1); } return h->item; }
Item STselect(link head, int r) { return selectR(head, r); }
Item selectR(link h, int r) { int t = hl->N; if (t > r) return selectR(hl, r); if (t < r) return selectR(hr, r-t-1); return *(h->item); }
Item STselect (int k) { return (selectR (rootNodeLink, k)); }