BRNode * treePredecessor(BRNode * x) { if (x->left != NULL) { return treeMaximum(x->left); } BRNode * y = x->p; while (y != NULL && x == y->left) { x = y; y = y->p; } return y; }
extern void LSQ_RewindOneElement(LSQ_IteratorT iterator) { IteratorT * iter = (IteratorT *)iterator; if (IS_HANDLE_INVALID(iterator) || (iter->tree->size == 0)) return; if (LSQ_IsIteratorPastRear(iterator)){ iter->node = treeMaximum(iter->tree->root); iter->state = IST_DEREFERENCABLE; return; } iter->node = predecessor(iter->node); if (iter->node == NULL) iter->state = IST_BEFORE_FIRST; }
static TreeNodeT * predecessor(TreeNodeT * node) { TreeNodeT * parent = NULL; TreeNodeT * cur_node = node; if (node == NULL) return NULL; parent = node->parent; if (node->l_child != NULL) return treeMaximum(node->l_child); while ((parent != NULL) && (cur_node == parent->l_child)) { cur_node = parent; parent = parent->parent; } return parent; }
int main() { Arvore *raiz = NULL; Arvore *buscasNaArvore = NULL; Arvore *trazMenorMaior = NULL; int chave; int chaveBuscada; //int valor; int opcao; do{ printf("Arvores de busca binaria sem balanceamento\n"); printf("1 - Inserir\n"); printf("2 - Mostrar\n"); printf("3 - Pesquisar\n"); printf("4 - Relembrar quem esta na raiz\n"); printf("5 - Mostrar menor valor na arvore\n"); printf("6 - Mostrar maior valor na arvore\n"); printf("7 - Remover valor da arvore\n"); printf("0 - Sair\n"); scanf("%d",&opcao); switch(opcao){ case 1: printf("\ninforme a chave e tecle enter\n"); scanf("%d",&chave); raiz = treeInsert(raiz,chave); break; case 2: printf("Valores alocados nessa arvore = \n"); mostraArvoreEmOrdem(raiz); printf("\n"); break; case 3: printf("\ndigite uma chave a ser buscada nessa arvore e tecle enter\n"); scanf("%d",&chaveBuscada); buscasNaArvore = treeSearch(raiz,chaveBuscada); if(buscasNaArvore!=NULL){ printf("encontrei esse cara\n"); }else{ printf("valor nao presente na arvore\n"); } break; case 4: mostraRaizDaArvore(raiz); break; case 5: if(raiz!=NULL){ trazMenorMaior = treeMinimum(raiz); printf("menor valor nesta arvore = %d\n",trazMenorMaior->chave); } break; case 6: if(raiz!=NULL){ trazMenorMaior = treeMaximum(raiz); printf("maior valor nesta arvore = %d\n",trazMenorMaior->chave); } break; case 7: if(raiz!=NULL){ printf("Informe o valor para deletar e tecle enter\n"); scanf("%d",&chaveBuscada); raiz = treeDelete(raiz,chaveBuscada); } break; } }while(opcao!=0); return 0; }