Mercurial > hg > GearsTemplate
changeset 445:f02bd096af64
fix RedBlackTree.cbc Insertion
author | ryokka |
---|---|
date | Tue, 28 Nov 2017 22:15:23 +0900 |
parents | 0c024ea61601 |
children | 41a6f8482374 |
files | src/parallel_execution/CMakeLists.txt src/parallel_execution/RedBlackTree.cbc |
diffstat | 2 files changed, 207 insertions(+), 599 deletions(-) [+] |
line wrap: on
line diff
--- a/src/parallel_execution/CMakeLists.txt Sun Nov 26 04:26:44 2017 +0900 +++ b/src/parallel_execution/CMakeLists.txt Tue Nov 28 22:15:23 2017 +0900 @@ -123,3 +123,10 @@ SOURCES examples/bitonicSort/sort.cbc ) + +GearsCommand( + TARGET + rbtree + SOURCES + RedBlackTree.cbc +)
--- a/src/parallel_execution/RedBlackTree.cbc Sun Nov 26 04:26:44 2017 +0900 +++ b/src/parallel_execution/RedBlackTree.cbc Tue Nov 28 22:15:23 2017 +0900 @@ -2,7 +2,8 @@ #include "../context.h" -extern enum Relational compare(struct Node* node1, struct Node* node2); +// extern enum Relational compare(struct Node* node1, struct Node* node2); + Tree* createRedBlackTree(struct Context* context) { struct Tree* tree = new Tree(); @@ -10,643 +11,243 @@ tree->tree = (union Data*)redBlackTree; redBlackTree->root = NULL; redBlackTree->nodeStack = (union Data*)createSingleLinkedStack(context); - tree->put = C_putRedBlackTree; - tree->get = C_getRedBlackTree; + + // tree->put = C_putRedBlackTree; + // tree->get = C_getRedBlackTree; // tree->remove = C_removeRedBlackTree; // tree->clear = C_clearRedBlackTree; return tree; } -void printTree1(union Data* data) { - struct Node* node = &data->Node; - if (node == NULL) { - printf("NULL"); - } else { - printf("key = %d (", node->key); - printTree1((union Data*)(node->right)); - printf("), ("); - printTree1((union Data*)(node->left)); - printf(")"); - } -} - -void printTree(union Data* data) { - printTree1(data); - printf("\n"); -} - -__code putRedBlackTree(struct RedBlackTree* tree, struct Node* node) { - struct Node* newNode = &ALLOCATE(context, Node)->Node; - struct Node* root = tree->root; - printTree((union Data*)(tree->root)); - tree->newNode = newNode; - tree->root = newNode; // this should done at stackClear - tree->parent = NULL; - if (root) { - tree->current = root; - tree->result = compare(tree->current, node); - goto findNode(tree); - } - goto insertNode(tree, node); -} - -__code findNode(struct RedBlackTree* tree) { - struct Stack* nodeStack = tree->nodeStack; - struct Node* oldNode = tree->current; - struct Node* newNode = tree->newNode; - tree->previous = newNode; - *newNode = *oldNode; - goto nodeStack->push(newNode, replaceNode1); -} - -__code findNode1(struct RedBlackTree* tree, struct Node* node, __code next(...)) { - struct Node* oldNode = tree->current; - struct Node* newNode = tree->previous; - struct Node* newnewNode = &ALLOCATE(context, Node)->Node; - int result = tree->result; - if (result == EQ) { - newNode->value = node->value; - // go to stack clear - goto next(...); - } else if (result == GT) { - tree->current = oldNode->right; - newNode->right = newnewNode; - } else { - tree->current = oldNode->left; - newNode->left = newnewNode; - } - tree->newNode = newnewNode; - if (tree->current) { - tree->result = compare(tree->current, node); - goto findNode(tree); - } - goto insertNode(tree, node); - -} +// void printTree(union Data* data) { +// printTree1(data); +// printf("\n"); +// } +// +// void printTree1(union Data* data) { +// struct Node* node = &data->Node; +// if (node == NULL) { +// printf("NULL"); +// } else { +// printf("key = %d (", node->key); +// printTree1((union Data*)(node->right)); +// printf("), ("); +// printTree1((union Data*)(node->left)); +// printf(")"); +// } +// } +// +// __code putRedBlackTree(struct RedBlackTree* tree, struct Node* node) { +// struct Node* newNode = &ALLOCATE(context, Node)->Node; +// struct Node* root = tree->root; +// printTree(tree->root); +// tree->newNode = newNode; +// tree->root = newNode; // this should done at stackClear +// tree->parent = NULL; +// if (root) { +// tree->current = root; +// tree->result = compare(tree->current, node); +// goto insertRBTree(tree); +// } +// goto insertRBTree(tree, node); +// } -__code insertNode(struct RedBlackTree* tree, struct Node* node) { - struct Stack* nodeStack = tree->nodeStack; - struct Node* newNode = tree->newNode; - *newNode = *node; - newNode->color = Red; - tree->current = newNode; - goto nodeStack->get2(insertCase1); -} - -__code insertCase1(struct RedBlackTree* tree, struct Node *parent, struct Node *grandparent) { - if (parent != NULL) { - tree->parent = parent; - tree->grandparent = grandparent; - goto insertCase2(tree); - } - tree->root->color = Black; - goto stackClear(); -} - -__code insertCase1_stub(struct Context* context) { - goto insertCase1(context, - &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, - &context->data[D_Stack]->Stack.data->Node, - &context->data[D_Stack]->Stack.data1->Node); -} - -__code insertCase2(struct RedBlackTree* tree) { - if (tree->parent->color == Black) { - goto stackClear(); - } - goto insertCase3(tree); -} - -__code insertCase3(struct RedBlackTree* tree) { - struct Stack* nodeStack = tree->nodeStack; - struct Node* uncle; - - if (tree->grandparent->left == tree->parent) - uncle = tree->grandparent->right; - else - uncle = tree->grandparent->left; - - if (uncle && (uncle->color == Red)) { - // do insertcase1 on grandparent, stack must be pop by two - tree->parent->color = Black; - uncle->color = Black; - tree->grandparent->color = Red; - tree->current = tree->grandparent; - goto nodeStack->pop2(insertCase1); - } - goto insertCase4(); -} - -__code insertCase4(struct RedBlackTree* tree, struct RotateTree* rotateTree) { - struct Stack* nodeStack = tree->nodeStack; - - if ((tree->current == tree->parent->right) && (tree->parent == tree->grandparent->left)) { - tree->current = tree->current->left; - tree->parent = tree->grandparent; - - rotateTree->traverse = tree; - rotateTree->next = C_insertCase5; - - goto nodeStack->pop(rotateLeft); - } else if ((tree->current == tree->parent->left) && (tree->parent == tree->grandparent->right)) { - tree->parent = tree->grandparent; - tree->current = tree->current->right; - - rotateTree->traverse = tree; - rotateTree->next = C_insertCase5; - - goto nodeStack->pop(rotateRight); - } - - goto insertCase5(); +__code stackClear(struct RedBlackTree* tree, struct Stack* nodeStack, __code next(...)) { + tree->current = 0; + nodeStack->stack = (union Data*)tree->nodeStack; + nodeStack->next = next; + goto meta(context, tree->nodeStack->clear); } -__code insertCase5(struct RedBlackTree* tree) { - struct Stack* nodeStack = tree->nodeStack; - goto nodeStack->pop2(insertCase51); -} - -__code insertCase51(struct RedBlackTree* tree, struct RotateTree* rotateTree, struct Node* parent, struct Node* grandparent) { - struct Node* current = tree->current; - tree->parent = parent; - tree->grandparent = grandparent; - - parent->color = Black; - grandparent->color = Red; - - tree->current = grandparent; - - rotateTree->traverse = tree; - rotateTree->next = C_stackClear; - - if ((current == parent->left) && (parent == grandparent->left)) - goto rotateRight(); - else - goto rotateLeft(); -} - -__code insertCase51_stub(struct Context* context) { - struct Node* parent = &context->data[D_Stack]->Stack.data->Node; - struct Node* grandparent = &context->data[D_Stack]->Stack.data1->Node; - goto insertCase51(context, - &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, - Gearef(context, RotateTree), - parent, - grandparent); -} +// __code getRedBlackTree(struct RedBlackTree* tree, __code next(...)) { + // if (tree->root) { + // tree->current = tree->root; + // goto insertRBTree(); + // // goto deleteRBTree(); + // } + // + // goto next(...); + // } -__code rotateLeft(struct RedBlackTree* tree) { - struct Stack* nodeStack = tree->nodeStack; - goto nodeStack->get(rotateLeft1); -} - -__code rotateLeft_stub(struct Context* context) { - struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; - goto rotateLeft(context, traverse); -} - -__code rotateLeft1(struct Node* node, struct RedBlackTree* tree, struct Node* parent, struct RotateTree* rotateTree) { - struct Node* tmp = node->right; - - if (parent) { - if (node == parent->left) - parent->left = tmp; - else - parent->right = tmp; - } else { - tree->root = tmp; - } - - node->right = tmp->left; - tmp->left = node; - tree->current = tmp; - - goto meta(context, rotateTree->next); -} - -__code rotateLeft1_stub(struct Context* context) { - struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; - struct Node* parent = &context->data[D_Stack]->Stack.data->Node; - goto rotateLeft1(context, - traverse->current, - traverse, - parent, - Gearef(context, RotateTree)); +__code insertRBTree(struct Node* newNode,struct Stack* nodeStack, struct RedBlackTree* rbtree) { + rbtree->current = rbtree->root; + goto insertLocate(newNode, nodeStack, rbtree); } -__code rotateRight(struct RedBlackTree* tree) { - struct Stack* nodeStack = tree->nodeStack; - goto nodeStack->get(rotateRight1); -} +__code insertLocate(struct Node* node, struct Stack* nodeStack, struct RedBlackTree* rbtree) { -__code rotateRight_stub(struct Context* context) { - struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; - goto rotateLeft(context, traverse); -} + struct Stack* nodeStack = tree->nodeStack; + struct Node* trace = rbtree->current; -__code rotateRight1(struct Node* node, struct RedBlackTree* traverse,struct Node *parent,struct RotateTree *rotateTree) { - struct Node* tmp = node->left; - - if (parent) { - if (node == parent->left) - parent->left = tmp; - else - parent->right = tmp; - } else { - traverse->root = tmp; - } - - node->left = tmp->right; - tmp->right = node; - traverse->current = tmp; - - goto meta(context, rotateTree->next); + // i think faster "compare rbtree->current, node" than "switch case EQ, LT, RT" + if (rbtree->current > node) { + goto nodestack->push(nodeStack,trace,insertLocate); + } else if (rbtree->current < node) { + goto nodestack->push(nodeStack, trace, insertLocate); + } else if (rbtree->current == node) { + printf("alady member this node(insertLocate)"); + goto next(...); + } else if (rbtree->current == null){ + rbtree->current = node; + goto nodeStack->pop(nodeStack,insertBalance); + }else{ + rbtree->root = node; + goto next(...); + } } -__code rotateRight1_stub(struct Context* context) { - struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; - struct Node* parent = &context->data[D_Stack]->Stack.data->Node; - goto rotateRight1(context, - traverse->current, - traverse, - parent, - Gearef(context, RotateTree)); -} - -__code stackClear(struct RedBlackTree* tree, struct Stack* nodeStack, __code next(...)) { - tree->current = 0; - nodeStack->stack = (union Data*)tree->nodeStack; - nodeStack->next = next; - goto meta(context, tree->nodeStack->clear); -} - -__code getRedBlackTree(struct RedBlackTree* tree, __code next(...)) { - if (tree->root) { - tree->current = tree->root; - - goto search(); - } - - goto next(...); -} - -__code search(struct RedBlackTree* tree, struct Node* node, __code next(...)) { - // compare(context, traverse, traverse->current->key, node->key); - tree->result = compare(tree->current, node); - if (tree->result == EQ) { - *node = *tree->current; - - goto meta(context, next); - } else if (tree->result == GT) { - tree->current = tree->current->right; - } else { - tree->current = tree->current->left; - } - - if (tree->current) - goto meta(context, C_search); - - goto next(...); +__code insertBalance(struct RedBlackTree* rbtree, struct Node* nodeStack, struct Node* node){ + rbtree->current = nodeStack->data; + // insert case + if (current->left->left || current->left->right){ + goto insertBalanceLeft(rbtree,nodeStack); + }else if (current->right->left || current->right->right){ + goto insertBalanceRight(rbtree,nodeStack); + }else{ + goto nodeStack->pop(nodeStack,insertBalance); + } } -/* /\* __code delete(struct Context* context, struct Tree* tree) { *\/ */ -/* /\* if (tree->root) { *\/ */ -/* /\* stack_push(context->code_stack, &context->next); *\/ */ -/* /\* context->next = Delete1; *\/ */ -/* /\* goto meta(context, Get); *\/ */ -/* /\* } *\/ */ - -/* /\* goto meta(context, context->next); *\/ */ -/* /\* } *\/ */ - -/* /\* __code delete_stub(struct Context* context) { *\/ */ -/* /\* goto delete(context, &context->data[Tree]->tree); *\/ */ -/* /\* } *\/ */ - -/* /\* __code delete1(struct Context* context, struct Tree* tree, struct Allocate* allocate) { *\/ */ -/* /\* allocate->size = sizeof(struct Node); *\/ */ -/* /\* allocator(context); *\/ */ - -/* /\* struct Node* root = tree->root; *\/ */ +__code insesrtBalanceLeft(struct RedBlackTree* rbtree, struct Node* nodeStack, struct Node* node){ -/* /\* tree->root = &context->data[context->dataNum]->node; *\/ */ -/* /\* tree->current = root; *\/ */ - -/* /\* compare(context, tree, tree->current->key, context->data[Node]->node.key); *\/ */ - -/* /\* goto meta(context, Replace_d1); *\/ */ -/* /\* } *\/ */ - -/* /\* __code delete1_stub(struct Context* context) { *\/ */ -/* /\* goto delete1(context, &context->data[Tree]->tree, &context->data[Allocate]->allocate); *\/ */ -/* /\* } *\/ */ - -/* /\* __code delete2(struct Context* context, struct Node* current) { *\/ */ -/* /\* if (current->color == Black) { *\/ */ -/* /\* struct Node* child = current->right == NULL ? current->left : current->right; *\/ */ -/* /\* current->color = child == NULL ? Black : child->color; *\/ */ - -/* /\* goto meta(context, DeleteCase1); *\/ */ -/* /\* } *\/ */ + if (current->color == Black && current->left->color == Red && current->left->left->color == Red){ + struct Node* tmp0 = rbtree->current; + struct Node* tmp1 = rbtree->current->left; + struct Node* tmp2 = rbtree->current->left->left; -/* /\* goto meta(context, Delete3); *\/ */ -/* /\* } *\/ */ - -/* /\* __code delete2_stub(struct Context* context) { *\/ */ -/* /\* goto delete2(context, context->data[Tree]->tree.current); *\/ */ -/* /\* } *\/ */ - -/* /\* __code delete3(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ -/* /\* struct Node* tmp = current->right == NULL ? current->left : current->right; *\/ */ - -/* /\* if (current->parent) { *\/ */ -/* /\* if (current == current->parent->left) *\/ */ -/* /\* current->parent->left = tmp; *\/ */ -/* /\* else *\/ */ -/* /\* current->parent->right = tmp; *\/ */ -/* /\* } else { *\/ */ -/* /\* tree->root = tmp; *\/ */ -/* /\* } *\/ */ - -/* /\* if (tmp) *\/ */ -/* /\* tmp->parent = current->parent; *\/ */ + rbtree->current = tmp1; + rbtree->current->right = tmp0; + rbtree->current->left = tmp2; + rbtree->current->right->right = tmp0->right; + rbtree->current->right->left = tmp1->right; + rbtree->current->color = Black; + rbtree->current->left->color = Red; + rbtree->current->right->color = Red; + goto nodeStack->pop(nodeStack,insertBalance); -/* /\* if (current->parent == NULL && tmp) *\/ */ -/* /\* tmp->color = Black; *\/ */ - -/* /\* current == current->parent->left ? (current->parent->left = NULL) : (current->parent->right = NULL); *\/ */ - -/* /\* stack_pop(context->code_stack, &context->next); *\/ */ -/* /\* goto meta(context, context->next); *\/ */ -/* /\* } *\/ */ + } else if(current->color == Black && current->left->color == Red && current->left->right->color == Red){ + struct Node* tmp0 = rbtree->current; + struct Node* tmp1 = rbtree->current->left; + struct Node* tmp2 = rbtree->current->left->right; -/* /\* __code delete3_stub(struct Context* context) { *\/ */ -/* /\* goto delete3(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ -/* /\* } *\/ */ - -/* /\* __code replaceNodeForDelete1(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode, int result) { *\/ */ -/* /\* *newNode = *oldNode; *\/ */ - -/* /\* if (result == EQ) *\/ */ -/* /\* goto meta(context, Replace_d2); *\/ */ -/* /\* else if (result == GT) *\/ */ -/* /\* tree->current = newNode->right; *\/ */ -/* /\* else *\/ */ -/* /\* tree->current = newNode->left; *\/ */ + rbtree->current = tmp1; + rbtree->current->right = tmp0; + rbtree->current->left = tmp2; + rbtree->current->right->right = tmp0->right; + rbtree->current->right->left = tmp1->right; + rbtree->current->color = Black; + rbtree->current->left->color = Red; + rbtree->current->right->color = Red; + goto nodeStack->pop(nodeStack,insertBalance); -/* /\* tree->current->parent = newNode; *\/ */ - -/* /\* if (tree->current->left == NULL && tree->current->right == NULL) *\/ */ -/* /\* goto meta(context, Delete2); *\/ */ - -/* /\* if (result == GT) *\/ */ -/* /\* newNode->right = context->heap; *\/ */ -/* /\* else if (result == LT) *\/ */ -/* /\* newNode->left = context->heap; *\/ */ - -/* /\* allocator(context); *\/ */ - -/* /\* compare(context, tree, tree->current->key, context->data[Node]->node.key); *\/ */ - -/* /\* goto meta(context, Replace_d1); *\/ */ -/* /\* } *\/ */ + } +} -/* /\* __code replaceNodeForDelete1_stub(struct Context* context) { *\/ */ -/* /\* goto replaceNodeForDelete1(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node, context->data[Tree]->tree.result); *\/ */ -/* /\* } *\/ */ - -/* /\* __code replaceNodeForDelete2(struct Context* context, struct Tree* tree, struct Node* newNode) { *\/ */ -/* /\* if (tree->current->left && tree->current->right) { *\/ */ -/* /\* newNode->left->parent = newNode; *\/ */ -/* /\* tree->current = newNode->left; *\/ */ -/* /\* newNode->left = context->heap; *\/ */ -/* /\* tree->deleted = newNode; *\/ */ - -/* /\* allocator(context); *\/ */ -/* /\* tree->current->parent = newNode; *\/ */ - -/* /\* goto meta(context, FindMax1); *\/ */ -/* /\* } *\/ */ - -/* /\* goto meta(context, Delete2); *\/ */ -/* /\* } *\/ */ - -/* /\* __code replaceNodeForDelete2_stub(struct Context* context) { *\/ */ -/* /\* goto replaceNodeForDelete2(context, &context->data[Tree]->tree, &context->data[context->dataNum]->node); *\/ */ -/* /\* } *\/ */ +__code insertBalanceRight(struct RedBlackTree* rbtree, struct Node* nodeStack, struct Node* node){ + if (current->color == Black && current->right->color == Red && current->right->right->color == Red){ + struct Node* tmp0 = rbtree->current; + struct Node* tmp1 = rbtree->current->left; + struct Node* tmp2 = rbtree->current->left->right; -/* /\* __code findMax1(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode) { *\/ */ -/* /\* *newNode = *oldNode; *\/ */ - -/* /\* if (newNode->right) *\/ */ -/* /\* goto meta(context, FindMax2); *\/ */ - -/* /\* tree->deleted->key = newNode->key; *\/ */ -/* /\* tree->deleted->value = newNode->value; *\/ */ - -/* /\* tree->current = newNode; *\/ */ + rbtree->current = tmp1; + rbtree->current->right = tmp0; + rbtree->current->left = tmp2; + rbtree->current->right->right = tmp0->right; + rbtree->current->right->left = tmp1->right; + rbtree->current->color = Black; + rbtree->current->left->color = Red; + rbtree->current->right->color = Red; + goto nodeStack->pop(nodeStack,insertBalance); -/* /\* goto meta(context, Delete2); *\/ */ -/* /\* } *\/ */ - -/* /\* __code findMax1_stub(struct Context* context) { *\/ */ -/* /\* goto findMax1(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node); *\/ */ -/* /\* } *\/ */ - - -/* /\* __code findMax2(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode) { *\/ */ -/* /\* *newNode = *oldNode; *\/ */ + } else if (current->color == Black && current->right->color == Red && current->right->left->color == Red){ -/* /\* if (newNode->right->right) { *\/ */ -/* /\* tree->current = newNode->right; *\/ */ -/* /\* newNode->right = context->heap; *\/ */ - -/* /\* allocator(context); *\/ */ -/* /\* tree->current->parent = newNode; *\/ */ - -/* /\* goto meta(context, FindMax2); *\/ */ -/* /\* } *\/ */ + struct Node* tmp0 = rbtree->current; + struct Node* tmp1 = rbtree->current->right; + struct Node* tmp2 = rbtree->current->right->left; -/* /\* tree->deleted->key = newNode->right->key; *\/ */ -/* /\* tree->deleted->value = newNode->right->value; *\/ */ - -/* /\* tree->current = newNode; *\/ */ - -/* /\* goto meta(context, Delete2); *\/ */ -/* /\* } *\/ */ - -/* /\* __code findMax2_stub(struct Context* context) { *\/ */ -/* /\* goto findMax2(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node); *\/ */ -/* /\* } *\/ */ + rbtree->current = tmp1; + rbtree->current->right = tmp0; + rbtree->current->left = tmp2; + rbtree->current->right->right = tmp0->right; + rbtree->current->right->left = tmp1->right; + rbtree->current->color = Black; + rbtree->current->left->color = Red; + rbtree->current->right->color = Red; + goto nodeStack->pop(nodeStack,insertBalance); -/* /\* __code deleteCase1(struct Context* context, struct Node* current) { *\/ */ -/* /\* if (current->parent) *\/ */ -/* /\* goto meta(context, DeleteCase2); *\/ */ - -/* /\* goto meta(context, Delete3); *\/ */ -/* /\* } *\/ */ + } else { + printf("error insertBalanceRight"); + goto next(...); + } +} -/* /\* __code deleteCase1_stub(struct Context* context) { *\/ */ -/* /\* goto deleteCase1(context, context->data[Tree]->tree.current); *\/ */ -/* /\* } *\/ */ - -/* /\* __code deleteCase2(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ -/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ - -/* /\* if ((sibling == NULL ? Black : sibling->color) == Red) { *\/ */ -/* /\* current->parent->color = Red; *\/ */ -/* /\* sibling->color = Black; *\/ */ +// insertion code end -/* /\* current == current->parent->left ? (current->parent->left = context->heap) : (current->parent->right = context->heap); *\/ */ -/* /\* allocator(context); *\/ */ -/* /\* context->data[context->dataNum]->node = *sibling; *\/ */ - -/* /\* tree->current = current->parent; *\/ */ - -/* /\* context->next = DeleteCase3; *\/ */ -/* /\* stack_push(context->code_stack, &context->next); *\/ */ + + -/* /\* if (current == current->parent->left) *\/ */ -/* /\* goto meta(context, RotateL); *\/ */ -/* /\* else *\/ */ -/* /\* goto meta(context, RotateR); *\/ */ -/* /\* } *\/ */ - -/* /\* goto meta(context, DeleteCase3); *\/ */ -/* /\* } *\/ */ - -/* /\* __code deleteCase2_stub(struct Context* context) { *\/ */ -/* /\* goto deleteCase2(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ -/* /\* } *\/ */ +// __code deleteRBTree(struct RedBlackTree newNode, struct RedBlackTree* rbtree) { +// rbtree->current = rbtree->root; +// goto deleteLocate; +// } -/* /\* __code deleteCase3(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ -/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ - -/* /\* if (current->parent->color == Black && *\/ */ -/* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ -/* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ -/* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ -/* /\* sibling->color = Red; *\/ */ - -/* /\* tree->current = current->parent; *\/ */ -/* /\* goto meta(context, DeleteCase1); *\/ */ -/* /\* } *\/ */ - -/* /\* goto meta(context, DeleteCase4); *\/ */ -/* /\* } *\/ */ - -/* /\* __code deleteCase3_stub(struct Context* context) { *\/ */ -/* /\* goto deleteCase3(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ -/* /\* } *\/ */ +// __code deleteLocate(struct Node* node, struct Stack* nodeStack, struct RedBlackTree* rbtree) { +// /\* check delete node locate and push route node *\/ +// struct Stack* nodeStack = tree->nodeStack; +// struct Node* trace = rbtree->current; -/* /\* __code deleteCase4(struct Context* context, struct Node* current) { *\/ */ -/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ - -/* /\* if (current->parent->color == Red && *\/ */ -/* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ -/* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ -/* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ -/* /\* sibling->color = Red; *\/ */ -/* /\* current->parent->color = Black; *\/ */ - -/* /\* goto meta(context, Delete3); *\/ */ -/* /\* } *\/ */ - -/* /\* goto meta(context, DeleteCase5); *\/ */ -/* /\* } *\/ */ - -/* /\* __code deleteCase4_stub(struct Context* context) { *\/ */ -/* /\* goto deleteCase4(context, context->data[Tree]->tree.current); *\/ */ -/* /\* } *\/ */ +// if (rbtree->current > node) { +// goto nodeStack->push(nodeStack,trace,deleteLocate); +// } else if (rbtree->current < node) { +// goto nodeStack->push(trace,deleteLocate); +// } else if (rbtree->current == node) { +// // trace = rbtree->current; +// goto deleteNode(struct Stack* nodeStack, struct RedBlackTree* rbtree,struct Node* trace); +// // goto nodeStack->push(trace,deleteNode); +// } else if (rbtree->current == null){ +// printf("No member Delete node (__code deleteLocate)"); +// goto next(...); +// } else { +// printf("Error,__code deleteLocate"); +// goto next(...); +// } +// } -/* /\* __code deleteCase5(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ -/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ -/* /\* sibling->parent = current->parent; *\/ */ - -/* /\* if (current == current->parent->left && *\/ */ -/* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ -/* /\* (sibling->left == NULL ? Black : sibling->left->color) == Red && *\/ */ -/* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ -/* /\* sibling->color = Red; *\/ */ -/* /\* sibling->left->color = Black; *\/ */ - -/* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ -/* /\* allocator(context); *\/ */ -/* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ -/* /\* *tmp = *sibling; *\/ */ -/* /\* tmp->parent = current; *\/ */ - -/* /\* tmp->left = context->heap; *\/ */ -/* /\* allocator(context); *\/ */ -/* /\* context->data[context->dataNum]->node = *sibling->left; *\/ */ -/* /\* context->data[context->dataNum]->node.parent = tmp; *\/ */ +// __code deleteNode(struct Node* node, struct Stack* nodeStack, struct RedBlackTree* rbtree) { +// struct Stack* nodeStack = tree->nodeStack; +// struct Node* replaceNode = nodeStack->data; -/* /\* tree->current = tmp; *\/ */ - -/* /\* context->next = DeleteCase6; *\/ */ -/* /\* stack_push(context->code_stack, &context->next); *\/ */ - -/* /\* goto meta(context, RotateR); *\/ */ -/* /\* } else if (current == current->parent->right && *\/ */ -/* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ -/* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ -/* /\* (sibling->right == NULL ? Black : sibling->right->color) == Red) { *\/ */ -/* /\* sibling->color = Red; *\/ */ -/* /\* sibling->right->color = Black; *\/ */ - -/* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ -/* /\* allocator(context); *\/ */ -/* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ -/* /\* *tmp = *sibling; *\/ */ -/* /\* tmp->parent = current; *\/ */ - -/* /\* tmp->right = context->heap; *\/ */ -/* /\* allocator(context); *\/ */ -/* /\* context->data[context->dataNum]->node = *sibling->right; *\/ */ -/* /\* context->data[context->dataNum]->node.parent = tmp; *\/ */ +// if(replaceNode->right == null){ +// rbtree->current = replaceNode; +// rbtree->current = rbtree->current->left; +// goto deleteUnbalance(nodeStack,replaceNode); +// }else if(replaceNode->left == null){ +// rbtree->current = replaceNode; +// rbtree->current = rbtree->current->right; +// goto deleteUnbalance(nodeStack,replaceNode); +// //goto deleteNodeReplaceNull(); +// }else{ +// // goto nodeStack->push(nodeStack,replaceNode,deleteNodeReplace); +// goto deleteNodeReplace(nodeStack,replaceNode); +// } +// } -/* /\* tree->current = tmp; *\/ */ -/* /\* context->next = DeleteCase6; *\/ */ -/* /\* stack_push(context->code_stack, &context->next); *\/ */ -/* /\* goto meta(context, RotateL); *\/ */ -/* /\* } *\/ */ - -/* /\* goto meta(context, DeleteCase6); *\/ */ -/* /\* } *\/ */ +// __code deleteNodeReplace(){ -/* /\* __code deleteCase5_stub(struct Context* context) { *\/ */ -/* /\* goto deleteCase5(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ -/* /\* } *\/ */ +// if (replaceNode->left != null){ +// replaceNode = replaceNode->left; +// goto deleteNodeReplace(); +// }else if(){ -/* /\* __code deleteCase6(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ -/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ - -/* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ -/* /\* allocator(context); *\/ */ -/* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ -/* /\* *tmp = *sibling; *\/ */ -/* /\* tmp->parent = current; *\/ */ -/* /\* tmp->color = current->parent->color; *\/ */ -/* /\* current->parent->color = Black; *\/ */ - -/* /\* context->next = Delete3; *\/ */ -/* /\* stack_push(context->code_stack, &context->next); *\/ */ - -/* /\* if (current == current->parent->left) { *\/ */ -/* /\* tmp->right->color = Black; *\/ */ -/* /\* tree->current = current->parent; *\/ */ +// } + +// } + -/* /\* goto meta(context, RotateL); *\/ */ -/* /\* } else { *\/ */ -/* /\* tmp->left->color = Black; *\/ */ -/* /\* tree->current = current->parent; *\/ */ +// __code deleteUnbalance() { +// if () { +// } -/* /\* goto meta(context, RotateR); *\/ */ -/* /\* } *\/ */ -/* /\* } *\/ */ - -/* /\* __code deleteCase6_stub(struct Context* context) { *\/ */ -/* /\* goto deleteCase6(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ -/* /\* } *\/ */ +// }